2015-07-10 65 views
1

休眠Envers(标准API)将由ID修订自动添加一个条款order by当不加入投影和不添加顺序。此过程加重了查询性能,并显示警告已超出I/O限制休眠Envers标准API“通过顺序”子句自动

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

随着 'order by' 查询使用,没有 'ORDER BY' 30,000字节。 它是一个超过500万行审计表。

我寻求30 100之间或结果:

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

即使不添加条款 '通过顺序'(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.en最终版本的envers。

+0

没有'order by'的查询开销是** 19 **和** 137 **。 –

回答