實現Hibernate分頁查詢原理解讀

2021-04-08 22:48:28 字數 1448 閱讀 8671

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分頁查詢顯示

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

Hibernate分頁查詢的實現

設定分頁引數 query.setfirstresult firstresult setmaxresults maxresult 表示從第firstresult 1個物件開始,獲取接下來的maxresult個資料。setfirstresult 方法的引數是開始獲取物件的行數,從0開始編號 setmax...

Hibernate實現分頁

hibernate提供了乙個支援跨系統的分頁機制,這樣無論底層是什麼樣的資料庫都能用統一的介面進行分頁操作。不用寫oracle專用的3層巢狀是一件多麼幸運的事啊 舉個例子 比如 分頁顯示方法 返回乙個從第n條開始到第m條結束的記錄集合 即每頁顯示m條記錄 param pagehql 動態hql語句 ...