用envers列出每个实体的最新修订版

pow*_*cha 8 java sql hibernate hibernate-envers

我正在尝试检索尚未删除的所有实体的最新版本.使用subselect在SQL中执行此操作非常简单:

select * from article_aud aud1
where rev in
 (select max(rev) from article_aud aud2
  where aud1.id = aud2.id)
and revtype < 2
Run Code Online (Sandbox Code Playgroud)

但我不知道如何通过envers API实现这一点.我从AuditReader开始,但没有找到方法,选择不同的对象

public List<Object[]> findLatestArticleRevisions(){
    List<Object[]> results = (List<Object[]>) getJpaTemplate().execute(new AuditReaderCallback() {
        @Override
        public Object doInAuditReader(AuditReader auditReader) {
            return auditReader.createQuery().forRevisionsOfEntity(Article.class, false, false)
                // TODO select distinct on entities
                .addOrder(new PropertyAuditOrder(new RevisionNumberPropertyName(), false))
                .getResultList();
        }
    });

    return results;
}
Run Code Online (Sandbox Code Playgroud)

重要提示:我想在一个或至少两个查询中执行此操作,因为我有许多文章(实体)有许多修订.

非常感谢!

cha*_*ybr 8

我们需要使用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();
Run Code Online (Sandbox Code Playgroud)

另请参阅:

使用envers查找小于或等于给定修订的每个实体的最大修订版本

hibernate envers可以返回特定类型的所有实体的最新版本吗?