我在尝试让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开始把它放在所有地方,而不是在单个位置?
答案 0 :(得分:0)
我担心Envers目前无法做到这一点。您需要在maxExpression中添加类似parentIdEqual()的内容,但是没有类似的组合器。
请打开功能请求:https://hibernate.onjira.com/secure/Dashboard.jspa
对于originalId,Envers实体具有修订号和原始id的复合id(保存在originalId子属性中)。