我有一个 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.
对此行为有何解释?我对日志中的这个误导性结果有更多疑问。
最佳答案
您正在设置计数投影。这使得 hibernate 返回计数:
select count(*) from ...
然后,您告诉 Hibernate,尽管无法为此类查询获取多于一行的信息,但仍将返回的行列表限制为最多 100 行。使用数据库执行此操作的正确方法是执行 Hibernate 所做的操作:
select * from ( <original query> ) where rownum <= 100;
如果您不想进行无用的包装查询,则只需不要调用无用的 setMaxResults(100)
方法即可。
关于java - 为什么 Hibernate 会记录一个它实际上并未执行的不同查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41642562/