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...