2017-01-13 18 views
0

我有一个Hibernate查询来检索限于最大数量的行的列表。但是,当我读了Hibernate的日志,我惊讶的是,它在内部过滤器只具有一行select count(*)为什么Hibernate会记录一个不实际执行的不同查询?

-- 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; 

的outter标准的子查询是这样的:

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

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

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

回答

2

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

select count(*) from ... 

然后你告诉Hibernate中,虽然没有办法让不是单行更多这样的查询,以限制返回的行最大100行的列表。正确的方法做到这一点使用你的数据库是做休眠做什么:

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

如果你不想让没用包裹查询,后来干脆不叫无用setMaxResults(100)方法。

+0

我的意思是,setMaxResulst实际上会将检索到的数据过滤100。这是必要的。我做了一个内部查询,它有1500个返回值,所以我需要100个过滤器,不要超载。它按预期进行过滤。但另一方面,Hibernate以不同的方式解释查询,就像它只有1个计数(*)一样。我将用内部查询更新问题。感谢您的及时答复。 – another

+0

执行select count(*),没有任何group by的查询不能返回多于1行。永远不会返回1500行。 –

+0

我会扩展代码,我可能会略过一些代码。 – another

相关问题