Hibernate分頁查詢原理解讀

2021-06-16 02:02:41 字數 1473 閱讀 7845

hibernate 可以實現分頁查詢,例如:

從第2萬條開始取出100條記錄

query q = session.createquery("from cat as c");

q.setfirstresult(20000);

q.setmaxresults(100);

list l = q.list();

那麼hibernate底層如何實現分頁的呢?實際上hibernate的查詢定義在net.sf.hibernate.loader.loader這個類裡面,仔細閱讀該類**,就可以把問題徹底搞清楚。

hibernate2.0.3的loader源**第480行以下:

if (uselimit) sql = dialect.getlimitstring(sql);

preparedstatement st = session.getbatcher().preparequerystatement(sql, scrollable);

如果相應的資料庫定義了限定查詢記錄的sql語句,那麼直接使用特定資料庫的sql語句。

然後來看net.sf.hibernate.dialect.mysqldialect:

public boolean supportslimit()

public string getlimitstring(string sql)

這是mysql的專用分頁語句,再來看net.sf.hibernate.dialect.oracle9dialect:

public boolean supportslimit()

public string getlimitstring(string sql)

oracle採用巢狀3層的查詢語句結合rownum來實現分頁,這在oracle上是最快的方式,如果只是一層或者兩層的查詢語句的rownum不能支援order by。

如果資料庫不支援分頁的sql語句,那麼根據在配置檔案裡面

#hibernate.jdbc.use_scrollable_resultset true

預設是true,如果你不指定為false,那麼hibernate會使用jdbc2.0的scrollable result來實現分頁,看loader第430行以下:

if ( session.getfactory().usescrollableresultsets() )

else

如果支援scrollable result,使用resultset的absolute方法直接移到查詢起點,如果不支援的話,使用迴圈語句,rs.next一點點的移過去。

可見使用hibernate,在進行查詢分頁的操作上,是具有非常大的靈活性,hibernate會首先嘗試用特定資料庫的分頁sql,如果沒用,再嘗試scrollable,如果不行,最後採用rset.next()移動的辦法。

在查詢分頁**中使用hibernate的一大好處是,既兼顧了查詢分頁的效能,同時又保證了**在不同的資料庫之間的可移植性。

實現Hibernate分頁查詢原理解讀

hibernate 可以實現分頁查詢,例如 從第2萬條開始取出100條記錄 query q session.createquery from cat as c q.setfirstresult 20000 q.setmaxresults 100 list l q.list 那麼hibernate底層...

hibernate分頁模糊查詢

在web專案中,顯示資料一般採用分頁顯示的,在分頁的同時,使用者可能還有搜尋的需求,也就是模糊查詢,所以,我們要在dao寫乙個可以分頁並且可以動態加條件查詢的方法。分頁比較簡單,採用hibernate提供的分頁,動態條件採用map 字段 模糊值 封裝查詢條件,map可以新增多個查詢條件,是個不錯的選...

實現Hibernate分頁查詢顯示

昨天實現了分頁的jsp包含檔案,今天完成hibernate分頁查詢,並與分頁檔案結合,實現分頁顯示功能。2.control dao service裡面實現分頁查詢。dao 層面 public listgetrolebyquerybypage string query,int pageno,int p...