2010-04-15 50 views
1

我需要爲我的Hibernate應用程序添加paginator。我將它應用於我通過設置Projection.count()使用Criteria執行的一些數據庫操作,這很正常。 但是,當我使用hql查詢,我似乎無法得到和有效的方法來獲得結果計數。 如果我做query.list().size()它需要很多時間,我認爲休眠確實會加載內存中的所有對象。Hibernate Hql尋找paginator的結果大小

任何人都可以請建議一個有效的方法來檢索使用hql時的結果計數?

+0

看到這個問題:http://stackoverflow.com/questions/168084/is-there-一個更高效的方式製作分頁在休眠比執行é – serg 2010-04-15 15:17:57

回答

1

我在過去做過類似的事情。如果你想得到paginator的記錄總數,那麼我建議你先做一個單獨的查詢。這個查詢只需要進行計數並返回總數。

正如你懷疑的那樣,爲了統計你的主查詢記錄,hibernate確實必須加載所有記錄,儘管最好不要加載每條記錄的所有數據。但是這仍然需要時間。

如果你可以避開它,因爲即使計數查詢可能需要時間,如果你的where子句效率低下,只要檢查你有一整頁的記錄回來,並提出一種指示器來顯示下一頁可能會有更多結果。這是最快的方法,因爲您只需根據需要查詢每個頁面。

+0

嘿,謝謝你的迴應。你建議我可以設置某種類型的指標,以顯示它可能是更多的記錄..這個問題是如果我的pageSize是10,並假設有100條記錄,那麼對於第10頁,我會得到10個結果,我可能會設置dicator說明可能會有更多的記錄。事情是我們需要通過網絡服務將結果發送給用戶界面,在這種情況下,最後一次沒有結果的調用可能會對我們來說太昂貴... – KCore 2010-04-15 14:15:37

+0

好的,我過去用過的另一個技巧是解決這個問題而不是每次都帶回10個結果,我請求11.我仍然顯示10,但是第11個結果的存在用於表明可以添加「更多結果」鏈接,因爲安全地知道有更多結果。 除此之外,在開始請求頁面行之前,您必須查看初始計數查詢以瞭解有多少結果。如果你的索引是好的,因爲數據庫(而不是休眠)完成了工作,計數可以非常快。 – drekka 2010-04-15 23:52:41

+0

這個技巧很酷....我可以使用這個。 初始計數的問題是我的查詢會過於複雜,每次構建一個相應的計數查詢(簡單但是)對我來說都是一個開銷,因爲從哪裏涉及到一些3-4層(調用)我建立我的查詢,並在那裏我真正執行我的查詢。我不想增加我的堆棧.. :) – KCore 2010-04-16 05:49:15

2

你將不得不使用另一個查詢和Query#iterate()。見14.16. Tips & Tricks

你可以統計查詢結果的數目而不必返回他們:

((Integer) session.createQuery("select count(*) from ....").iterate().next()).intValue()