【发布时间】:2014-11-01 14:49:15
【问题描述】:
这可能很简单,但找不到方法。 我试图找到小于或等于给定修订号的每个实体的最大修订。
AuditQuery query = getAuditReader().createQuery().forRevisionsOfEntity(
entityClass, false, false);
query.add(AuditEntity.revisionNumber().le(revisionNumber));
query.addOrder(AuditEntity.revisionNumber().desc());
query.getResultList();
以上代码按降序返回同一实体的多个修订版本。我想获得小于或等于给定版本号的每个实体的最新不同版本。
作为一种解决方法,我正在过滤结果集,如下所示。我希望这种过滤可以在 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();
【问题讨论】:
标签: hibernate hibernate-envers