2012-06-07 73 views
0

我正在對來自休眠的一組結果執行分頁。目前,我做將休眠結果的子列表

long count = getCountResultForNamedQuery(); 
List result = getResultForNamedQuery() 

,其中兩個查詢類似

select count(*) from addresses where country = 'USA'; 

select * from addresses where country = 'USA'; 

對於分頁我平時更新getResultForQuery所以這是有.setFirstResult和setMaxResult設置。這將只會返回我想要的部分。我必須做一個計數,以便知道頁面的分頁部分需要顯示多少頁面。

我想知道我是否可以更有效率。我可以嗎

List result = getResultForQuery(); 
int count = result.size(); 
List subResult = result.subList(start, end); 

這是否有意義?我試圖只在可能的情況下調用一個查詢。問題是多麼聰明的休眠是?當我調用size時,它會計算它返回的對象shell,還是試圖解決所有問題,然後點擊數據庫?哪種模式更好?

道歉,如果例子不夠清楚。我試圖儘可能簡化它,可能已經簡化了它太多!

在此先感謝!

回答

2

你的第二個解決方案是有道理的,但可能會導致性能的災難,因爲它會在內存中加載的所有地址來自美國,而你只對他們的數量感興趣,並且只在這些地址的小範圍內。當您執行查詢時,查詢將返回一個列表,並且該列表將填充查詢的所有結果。這就是setFirstResult和setMaxResults有用的原因。

如果您不關心絕對確切的計數,您可以只執行一次計數查詢,然後對每個頁面執行「結果」查詢。

+0

感謝您的回答。我想這回答我的問題。我不確定是否所有的美國地址都會被加載。我的理解是,Hibernate只返回對象的外殼,然後當代碼實際訪問時,explicitley檢索每個字段。我不確定size()會在結果列表上做什麼 - 因此我的問題 – RNJ

+0

我真的建議你在使用Hibernate進行開發時打開SQL日誌記錄。這會讓你明白Hibernate何時執行查詢,執行哪些查詢,以及如何避免不必要的查詢。 –

0

你可以做如下 -

Query query = getSession().createQuery("your Query").setFirstResult(start_Index).setMaxResults(Number_Of_Records_You_Want_to_Display_on_page); 

例如 -

Query query = getSession().createQuery("select * from employee").setFirstResult(101).setMaxResults(100); 
+0

是的我正在考慮做類似的事情,但我想使用命名查詢,以便它是編譯類型檢查。 – RNJ

+0

沒有正確地幫你 –