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

时间:2012-11-23 15:38:31

标签: hibernate hibernate-envers

我在尝试让Envers执行我需要的查询时遇到了很大的问题。如果有人可以让我知道如果可以从Envers内部进行,或者我需要直接执行SQL,这将是一个巨大的帮助!

这是问题所在。我有一个虚构的“项目”实体 - 任何实体类都会做 - 经过审核。我试图通过AuditReader查询获取EVERY项目实体的最新版本。

当我这样做时(代码的其他部分无关紧要):

AggregatedAuditExpression maxExpression = AuditEntity.revisionNumber().maximize();
maxExpression.add(AuditEntity.id().eq("12345"));
query.add(maxExpression);

并打开SQL输出,我看到正在生成此查询:

Hibernate: select project_a0_.id as id6_0_, project_a0_.REV as REV6_0_, auditrevis1_.id as id0_1_,
project_a0_.REVTYPE as REVTYPE6_0_, project_a0_.description as descript4_6_0_, 
auditrevis1_.timestamp     as timestamp0_1_, auditrevis1_.username as username0_1_ 
from MYSCHEMA.project_AUD project_a0_ cross join MYSCHEMA.REVINFO auditrevis1_ 
where project_a0_.REV=

(select max(project_a2_.REV) from MYSCHEMA.project_AUD project_a2_ 
               where project_a2_.id=?) 

and project_a0_.REV=auditrevis1_.id order by project_a0_.REV asc

请注意“选择最大”部分。这几乎就是我的需要。只是where子句错了我需要它说:     project_a2_.id = project_a0_.id

我手工编辑,运行它,它完美无缺。现在它看起来像IdMapper类中的“addIdsEqualToQuery”方法让我做我想要的。所以如果我用这个改变了AuditEntity.id()。eq(“12345”):

maxExpression.add(new IdentifierIdsEqAuditExpression());

其中IdentifierIdsEqAuditExpression等于:

    class IdentifierIdsEqAuditExpression implements AuditCriterion {    
        @Override
        public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) {
            auditCfg.getEntCfg().get(entityName).getIdMapper()
                    .addIdsEqualToQuery(parameters, null, auditCfg.getAuditEntCfg().getOriginalIdPropName());
        }    
    }

它应该接近 - 它是。我明白了:

路径无效:'originalId.id'[从com.mycompany.Project_AUD e_ 中选择e __,r。com.mycompany.audit.AuditRevisionEntity r其中id = originalId.id和e _。originalId .REV.id =(从com.mycompany.Project_AUD e0中选择max(_e0.originalId.REV.id),其中id = originalId.id)和e _。originalId.REV.id = r。 id by e__.originalId.REV.id asc]

问题是我无法让它生成我需要的东西,即使前缀从“originalId”更改为正确的,为什么envers开始把它放在所有地方,而不是在单个位置?

1 个答案:

答案 0 :(得分:0)

我担心Envers目前无法做到这一点。您需要在maxExpression中添加类似parentIdEqual()的内容,但是没有类似的组合器。

请打开功能请求:https://hibernate.onjira.com/secure/Dashboard.jspa

对于originalId,Envers实体具有修订号和原始id的复合id(保存在originalId子属性中)。