【问题标题】:Can hibernate envers return the latest revision of all entities of a specific type?hibernate envers 可以返回特定类型的所有实体的最新版本吗?
【发布时间】:2012-11-11 23:54:12
【问题描述】:

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

这就是问题所在。我有一个虚构的“项目”实体——任何实体类都可以——已经过审计。我正在尝试通过 AuditReader 查询获取每个项目实体的最新版本。

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

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' [select e__, r from com.mycompany.Project_AUD e_, com.mycompany.audit.AuditRevisionEntity r where id = originalId.id and e_.originalId .REV.id = (select max(_e0.originalId.REV.id) from com.mycompany.Project_AUD e0 where id = originalId.id) and e_.originalId.REV.id = r. id order by e__.originalId.REV.id asc]

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

【问题讨论】:

    标签: hibernate hibernate-envers


    【解决方案1】:

    恐怕 Envers 目前无法做到这一点。您需要向 maxExpression 添加类似 parentIdEqual() 的内容,但没有这样的组合器。

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

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

    【讨论】:

    • 亚当 - 感谢您的回复。我创建了问题 HHH-7827(希望它足够清楚!)
    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 2019-12-13
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多