一尘不染

查找每个实体的最大修订小于或等于给定修订

hibernate

这可能很简单,但是找不到方法。我试图找到每个实体的最大修订小于或等于给定的修订号。

AuditQuery query = getAuditReader().createQuery().forRevisionsOfEntity(
    entityClass, false, false);
query.add(AuditEntity.revisionNumber().le(revisionNumber));     
query.addOrder(AuditEntity.revisionNumber().desc());
query.getResultList();

上面的代码按降序返回同一实体的多个修订。我想获得每个实体的最新不同修订版本,该修订版本应小于或等于给定的修订版本号。

作为一种解决方法,我正在过滤resultSet,如下所示。我希望可以在AuditQuery本身上进行此过滤。

    AuditQuery query = getAuditReader().createQuery().forRevisionsOfEntity(
            entityClass, false, false);
    query.add(AuditEntity.revisionNumber().le(revision));       
    query.addOrder(AuditEntity.revisionNumber().desc());
    List<?> list = query.getResultList();

    StringBuilder builder = new StringBuilder();
    EntityClass entity = null;
    Set<Long> entitySet = new HashSet<>();
    if (!list.isEmpty()) {
        for (int i = 0; i < list.size(); i++) {
            Object[] result = (Object[]) list.get(i);
            entity = (EntityClass) result[0];
            AuditRevision auditRevision = (AuditRevision) result[1];
            RevisionType operationType = (RevisionType) result[2];

            if (!entitySet.contains(entity.getId())) {
                //consider most recent revision of entity
                entitySet.add(entity.getId());
                builder.append(i + "-->");
                builder.append("id:" + entity.getId());
                builder.append(", auditRevision:" + auditRevision);
                builder.append(", operationType:" + operationType);
            }
        }
    }
    builder.append(", count:" + entitySet.size());

解:

我们需要使用
[https://hibernate.atlassian.net/browse/HHH-7827]的修复程序,即AuditEntity.revisionNumber()。maximize()。computeAggregationInInstanceContext()。

    AuditQuery query = getAuditReader().createQuery().forRevisionsOfEntity(
            entityClass, false, false);
    query.add(AuditEntity.revisionNumber().le(revision));
    query.add(AuditEntity.revisionNumber().maximize()
            .computeAggregationInInstanceContext());
    query.addOrder(AuditEntity.revisionNumber().desc());
    return query.getResultList();

阅读 250

收藏
2020-06-20

共1个答案

一尘不染

我认为您正在寻找AuditEntitry.revisionNumber.max()约束。这应该使满足嵌套约束的修订版本号最大化。

另请参阅有关此问题的文档

2020-06-20