gpt4 book ai didi

java - Hibernate Envers Criteria API 自动添加 'order by' 子句

转载 作者:太空宇宙 更新时间:2023-11-04 13:39:39 24 4
gpt4 key购买 nike

当未添加投影且未添加订单时,Hibernate Envers(Criteria API)会自动按 ID Revision 添加子句 'order by'。此过程会给查询性能带来负担,并显示超出 I/O 限制的警告。

AuditQuery query = getAuditReader().createQuery().forRevisionsOfEntity(MyEntity.class, false, true);

使用“order by”时,查询使用300,000,不使用“order by”时30,000 字节。这是一个超过500万行的审计表。

我寻求 30 到 100 个结果:

query.setFirstResult (1);
query.setMaxResults (30);

即使没有添加“order by”子句 (query.addOrder (...);),envers 也会这样做。生成的查询如下所示,例如:

select *
  from (select e.*
          from MY_ENTITY e,
               MY_REVISION_ENTITY re
         where e.ID_REVISAO = re.ID_REVISAO
           and re.ID_COL_EXTRA = 1234
        order by e.ID_REVISAO desc -- PROBLEM!!!
) Where rownum <= 30;

我注意到 org.hibernate.envers.query.impl.RevisionsOfEntityQuery 类的 list() 方法中有以下代码块:

 if (!hasProjection && !hasOrder) {
String revisionPropertyPath = verEntCfg.getRevisionNumberPath();
qb.addOrder(revisionPropertyPath, true);
}

这是一个错误吗?

我理解订购不随机记录的重要性,但这应该是一个自由选择。

我使用 4.1.3.Final 版本的 envers。

最佳答案

我得出的结论是,提高查询性能的替代方案应该是:表分区。根据开发指南 Hibernate Envers (http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch15.html#envers-partitioning) 使用审核策略:ValidityAuditStrategy

此外,自定义 Envers 以不添加默认的“order by”。

关于java - Hibernate Envers Criteria API 自动添加 'order by' 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31347888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com