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

标签 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.

对此行为有何解释?我对日志中的这个误导性结果有更多疑问。

最佳答案

您正在设置计数投影。这使得 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/

相关文章:

java - 如何使用注释存储时将实体类中的列值设为小写

java - 使用jdbc属性文件在applicatioinContext.xml中设置dataSource。为什么我必须使用${jdbc.XXX}而不是${XXX}?

java - 无法选择容器

Java Swing 右边框不适用于 Microsoft Windows

java - 是否可以检测内核生成 epoll 的时刻与 Sun JVM 读取它的时刻之间的时间差?

oracle - 拆分字符串并迭代存储过程中的每个值

sql - Oracle错误 "inconsistent datatypes: expected CHAR got LONG"

sql - 在Oracle中,为什么 '' = ''为假?

java - 检查java中列表是否包含另一个列表的任何项目

java - Apache MINA Vysper 文档?