我有一个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.
这种行为有什么解释?我对日志中的这种误导性结果有更多疑问。
答案 0 :(得分:2)
您正在设置计数预测。这使得hibernate返回计数:
select count(*) from ...
然后你告诉Hibernate,虽然没有办法为这样的查询获得多行,但是将返回的行列表限制为最多100行。使用数据库的正确方法是执行Hibernate的工作:
select * from ( <original query> ) where rownum <= 100;
如果您不想进行无用的包装查询,那么就不要调用无用的setMaxResults(100)
方法。