您好,登錄后才能下訂單哦!
本篇內容主要講解“Hibernate分頁管理怎么實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Hibernate分頁管理怎么實現”吧!
Hibernate中,通過對不同數據庫的統一接口設計,實現了透明化、通用化的分頁實現機制。
通過Criteria.setFirstResult和Criteria.setFetchSize方法設定分頁范圍,如:
Criteria criteria = session.createCriteria(TUser.class); criteria.add(Expression.eq("age", "20")); //從檢索結果中獲取第100條記錄開始的20條記錄 criteria.setFirstResult(100); criteria.setFetchSize(20);
通過Query.setFirstResult和Query.setMaxResults方法也可以設定分頁范圍,如:
Query query = session.createQuery("from TUser"); query.setFirstResult(100); query.setMaxResults(20); // query.setFetchSize(20); List list = query.list();
Hibernate中,抽象類org.hibernate.dialect.Dialect指定了所有底層數據庫的對外統一接口,通過針對不同數據庫提供相應的Dialect實現,數據庫之間的差異性得以消除,從而為上層機制提供了透明的、數據庫無關的存儲層基礎。對于分頁機制而言,Dialect中定義了一個方法如下:
/** * Add a LIMIT clause to the given SQL SELECT * * @return the modified SQL */ public String getLimitString(String querySelect, boolean hasOffset) { throw new UnsupportedOperationException( "paged queries not supported" ); } public String getLimitString(String querySelect, int offset, int limit) { return getLimitString( querySelect, offset>0 ); }
此方法用于在現有Select語句基礎上,根據各個數據庫自身特性,構造對應的記錄返回限定子句。如MySQL中對應的記錄限定子句為Limit,Oracle中,通過rownum子句實現。MySQLDialect中的getLimitString實現:
public String getLimitString(String sql, boolean hasOffset) { return new StringBuffer( sql.length()+20 ) .append(sql) .append( hasOffset ? " limit ?, ?" : " limit ?") .toString(); }
MySQLDialect.getLimitString方法的實現實際上是在給定的Select語句后追加MySQL所提供的專有SQL子句limit來實現。
Oracle9Dialect中的getLimitString實現:
public String getLimitString(String sql, boolean hasOffset) { sqlsql = sql.trim(); boolean isForUpdate = false; if ( sql.toLowerCase().endsWith(" for update") ) { sqlsql = sql.substring( 0, sql.length()-11 ); isForUpdate = true; } StringBuffer pagingSelect = new StringBuffer( sql.length()+100 ); if (hasOffset) { pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( "); } else { pagingSelect.append("select * from ( "); } pagingSelect.append(sql); if (hasOffset) { pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?"); } else { pagingSelect.append(" ) where rownum <= ?"); } if ( isForUpdate ) { pagingSelect.append( " for update" ); } return pagingSelect.toString(); }
通過Oracle特有的rownum子句來實現數據部分的讀取。SQLServerDialect中的getLimitString實現:
public String getLimitString(String querySelect, int offset, int limit) { if ( offset > 0 ) { throw new UnsupportedOperationException( "sql server has no offset" ); } return new StringBuffer( querySelect.length()+8 ) .append(querySelect) .insert( getAfterSelectInsertPoint(querySelect), " top " + limit ) .toString(); }
通過SQLServer特有的top子句實現。HSQLDialect中的getLimitString實現:
public String getLimitString(String sql, boolean hasOffset) { return new StringBuffer( sql.length() + 10 ) .append( sql ) .insert( sql.toLowerCase().indexOf( "select" ) + 6, hasOffset ? " limit ? ?" : " top ?" ) .toString(); }
大多數主流數據庫都提供了數據部分讀取機制,而對于某些沒有提供相應機制的數據庫而言,Hibernate也通過其他途徑實現了分頁,如通過Scrollable ResultSet,如果JDBC不支持Scrollable ResultSet,Hibernate也會通過ResultSet的next方法進行記錄定位。Hibernate通過底層對分頁機制的良好封裝,使得開發人員無需關心數據分頁的細節實現,將數據邏輯和存儲邏輯分離開來,在提高生產效率的同時,也大大加強了系統在不同數據庫平臺之間的可移植性。
到此,相信大家對“Hibernate分頁管理怎么實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。