2011-08-31 77 views
17

Hibernate Criteria支持提供了一個setMaxResults()方法來限制從數據庫返回的結果。休眠標準限制機制?

我無法在他們的文檔中找到任何答案 - 這是如何實現的?是否查詢整個結果集,然後僅返回請求編號?或者它真的限制了數據庫端的查詢(認爲LIMIT關鍵字和mySql一樣)。

這很重要,因爲如果查詢可能會返回許多許多結果,我真的需要知道setMaxResults()是否仍然會查詢數據庫中的所有行(這會很糟糕)。另外 - 如果它真正限制了數據庫端的行數,它是如何實現這個跨數據庫的(因爲我不認爲每個rdbms都支持像mySql這樣的LIMIT功能)。

回答

0

HQL不支持像SQL這樣的查詢內部的限制,而只支持您還發現的setMaxResults()

要確定它是否將setMaxResults()轉換爲LIMIT查詢,可以打開SQL日誌記錄。

11

Hibernate要求數據庫限制查詢返回的結果。它通過方言來實現這一點,它使用任何特定於數據庫的機制來執行此操作(因此對於SQL Server,它將執行類似於「從表中選擇頂級n *」的操作,Oracle將執行「select * from table where rownum < n 「,MySQL將執行」從表格極限n中選擇*「等)。然後它只返回數據庫返回的內容。

+0

Intersting。那麼,爲什麼您認爲他們沒有提供限制使用HQL的方法,只要他們能夠根據setMaxResults標準轉換爲特定的方言? – john

+0

看看http://stackoverflow.com/questions/1239723/how-do-you-do-a-limit-query-in-hql – Ritesh

+0

這可能會提供一些清晰度:http://stackoverflow.com/questions/1239723 /怎麼辦,你-DO-A-限制查詢功能於HQL。我的理解是,它歸結爲保持HQL零件數據庫不可知,方言的特定功能,然後通過額外的方法調用,如setMaxResults – brent777

2

我同時使用Hibernate和Hibernate Search,並且無需查看底層實現,我可以告訴你他們絕對不會返回所有結果。我已經實現了相同的查詢,返回所有結果,然後將其更改爲設置第一個結果和最大結果(以實現分頁),並且性能增益很大。

它們可能使用方言特定的SQL,例如, MySQL中的LIMIT,Oracle中的ROWNUM。你的實體經理意識到你正在使用的方言,所以這很簡單。

最後,如果您確實想要查看SQL Hibernate爲此查詢生成的內容,只需在創建實體管理器/工廠時將「show_sql」屬性設置爲true,並將其運行到控制檯的所有SQL 。

5

org.hibernate.dialect.Dialect類包含一個稱爲supportsLimit()的方法。如果dialect子類覆蓋此方法,則它們可以以其數據庫風格原生的方式實施行限制處理。您可以在org.hibernate.loader.Loader的類中看到此代碼的調用方式,該方法的標題爲prepareQueryStatement,只需搜索的限制即可。

但是,如果方言不支持此功能,則會對ResultSet迭代器進行硬性檢查,以確保在達到限制時Java對象(實體)結果將停止構建。該代碼也位於Loader