gpt4 book ai didi

java - 为什么 Hibernate 会记录一个它实际上并未执行的不同查询?

转载 作者:行者123 更新时间:2023-12-02 03:06:28 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com