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

时间:2015-07-10 18:31:00

标签: java hibernate hibernate-envers

Hibernate Envers (Criteria API)会在未添加投影时按ID修订版自动添加'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。最后版本的envers。

1 个答案:

答案 0 :(得分:0)

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

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