2012-07-13 49 views
3

我使用此代码对MySQL的分页查询语句(使用Struts 2 + Hibernate的工作):关于在MySQL

Query query=getSession().createQuery("from GovOffice"); 
query.setFirstResult(0); 
query.setMaxResult(100); 
List<GovOffice> list=query.list(); 

这是从第一个记录开始GovOffice的这将返回列表,显示100条记录每页。

假设我有100,000条记录,这个查询“从GovOffice”得到所有100,000条记录吗? 通过setFirstResult和setMaxReSult它将限制从100,000到100条记录。如果这是真的,这意味着分页必须是无用的。

如果没有任何方法来证明查询不会从DB获取数据,直到我们拨打query.list()

+0

你可以打印出休眠创建并看看,看看它做什么的HQL。但我相信它限制在数据库方面,只返回你的100个结果。 – 2012-07-13 14:28:09

+0

谢谢戴夫牛顿先生! – LeePhan 2012-07-13 17:05:59

回答

5

QuerysetFirstResultsetMaxResult使用数据库的基本可能性当量。

在MySQL的情况下,它是limit

所以,不,它不会获取所有记录,是的它是有效的。

源代码(org.hibernate.dialect.MySQLDialect)证明:

238 public String getLimitString(String sql, boolean hasOffset) { 
239  return new StringBuffer(sql.length()+20) 
240   .append(sql) 
241   .append(hasOffset ? " limit ?, ?" : " limit ?") 
242   .toString(); 
243 } 
+0

感谢破坏! – LeePhan 2012-07-13 16:50:19

3

我认为文档很清楚,只有最大的结果将从数据库中检索。

setMaxResults(int)

在我看来,是

SELECT * FROM GovOffice LIMIT 0, 100; 
+0

问题是关于Hibernate,这与问题无关。 Hibernate可能使用JPQL/Hibernate(HQL)查询(这是特别的)。这是行不通的。 'SELECT *'在Hibernate中不起作用。 – Lion 2012-07-13 14:33:54

+0

OP声明这是针对MySQL的,在使用MySQL的情况下,我的声明是正确的,他的代码反映了我上面写的SQL语句。 – 2012-07-13 14:36:51

+0

该代码显然与Hibernate相关,并且该问题也标记为Hibernate。 – Lion 2012-07-13 14:38:12