2012-07-13 48 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