It may be simple, but unable to find a way. I am trying to find the maximum revision of each object less than or equal to the specified revision number.
AuditQuery query = getAuditReader().createQuery().forRevisionsOfEntity( entityClass, false, false); query.add(AuditEntity.revisionNumber().le(revisionNumber)); query.addOrder(AuditEntity.revisionNumber().desc()); query.getResultList();
Above the code returns multiple versions of the same object in descending order. I would like to receive the last distinct revision of each entity that is less than or equal to the specified revision number.
As a workaround, I am filtering the resultSet as shown below. I hope this filtering can be done in AuditQuery itself.
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())) {
Decision:
We need to use the fix [ https://hibernate.atlassian.net/browse/HHH-7827] ie 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
charybr
source share