这可能很简单,但是找不到方法。我试图找到每个实体的最大修订小于或等于给定的修订号。
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();
我认为您正在寻找AuditEntitry.revisionNumber.max()约束。这应该使满足嵌套约束的修订版本号最大化。
AuditEntitry.revisionNumber.max()
另请参阅有关此问题的文档。