为什么Hibernate会记录一个它实际上没有执行的查询?

时间:2017-01-13 20:00:00

标签: java hibernate oracle11g log4j

我有一个Hibernate查询来检索限制为最大数字的行列表。但是,当我阅读Hibernate日志时,令我惊讶的是,它在内部过滤了一个只有一行的子查询select count(*)

-- Log4j
-- INFO  [STDOUT] Hibernate: 
select *
from ( select count(*) as y0_
       from yyy this_
       where this_.type=3 and
                   this_.VALUE=2 and
                   this_.src='ZZZZZ'
     )
where rownum <= 100;

外围标准是这样的:

criteria.setProjection(Projections.rowCount());
criteria.setMaxResults(MAX_RESULTS); // MAX_RESULTS = 100

final List results = criteria.list(); // It executes the above query here.

这种行为有什么解释?我对日志中的这种误导性结果有更多疑问。

1 个答案:

答案 0 :(得分:2)

您正在设置计数预测。这使得hibernate返回计数:

select count(*) from ...

然后你告诉Hibernate,虽然没有办法为这样的查询获得多行,但是将返回的行列表限制为最多100行。使用数据库的正确方法是执行Hibernate的工作:

select * from ( <original query> ) where rownum <= 100;

如果您不想进行无用的包装查询,那么就不要调用无用的setMaxResults(100)方法。