成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析Hibernate分頁管理

開發 后端
Hibernate中,抽象類org.hibernate.dialect.Dialect指定了所有底層數據庫的對外統一接口,通過針對不同數據庫提供相應的Dialect實現,數據庫之間的差異性得以消除,從而為上層機制提供了透明的、數據庫無關的存儲層基礎。

本文向大家介紹Hibernate分頁,可能好多人還不了解Hibernate分頁,沒有關系,看完本文你肯定有不少收獲,希望本文能教會你更多東西。

Hibernate中,通過對不同數據庫的統一接口設計,實現了透明化、通用化的分頁實現機制。

通過Criteria.setFirstResult和Criteria.setFetchSize方法設定分頁范圍,如:

  1. Criteria criteria = session.createCriteria(TUser.class);  
  2. criteria.add(Expression.eq("age", "20"));  
  3. //從檢索結果中獲取第100條記錄開始的20條記錄  
  4. criteria.setFirstResult(100);  
  5. criteria.setFetchSize(20);  
  6.  

通過Query.setFirstResult和Query.setMaxResults方法也可以設定分頁范圍,如:

  1. Query query = session.createQuery("from TUser");  
  2. query.setFirstResult(100);  
  3. query.setMaxResults(20);  // query.setFetchSize(20);  
  4. List list = query.list();  
  5.  

Hibernate中,抽象類org.hibernate.dialect.Dialect指定了所有底層數據庫的對外統一接口,通過針對不同數據庫提供相應的Dialect實現,數據庫之間的差異性得以消除,從而為上層機制提供了透明的、數據庫無關的存儲層基礎。對于分頁機制而言,Dialect中定義了一個方法如下:

  1. /**  
  2.   * Add a LIMIT clause to the given SQL SELECT  
  3.   *  
  4.   * @return the modified SQL  
  5.   */  
  6.  public String getLimitString(String querySelect, boolean hasOffset) {  
  7.   throw new UnsupportedOperationException( "paged queries not supported" );  
  8.  }  
  9.  
  10.  public String getLimitString(String querySelect, int offset, int limit) {  
  11.   return getLimitString( querySelect, offset>0 );  
  12.  }  
  13.  

此方法用于在現有Select語句基礎上,根據各個數據庫自身特性,構造對應的記錄返回限定子句。如MySQL中對應的記錄限定子句為Limit,Oracle中,通過rownum子句實現。MySQLDialect中的getLimitString實現:

  1. public String getLimitString(String sql, boolean hasOffset) {  
  2.   return new StringBuffer( sql.length()+20 )  
  3.    .append(sql)  
  4.    .append( hasOffset ? " limit ?, ?" : " limit ?")  
  5.    .toString();  
  6.  }  

MySQLDialect.getLimitString方法的實現實際上是在給定的Select語句后追加MySQL所提供的專有SQL子句limit來實現。

Oracle9Dialect中的getLimitString實現:

  1. public String getLimitString(String sql, boolean hasOffset) {  
  2.     
  3.   sqlsql = sql.trim();  
  4.   boolean isForUpdate = false;  
  5.   if ( sql.toLowerCase().endsWith(" for update") ) {  
  6.    sqlsql = sql.substring( 0, sql.length()-11 );  
  7.    isForUpdate = true;  
  8.   }  
  9.     
  10.   StringBuffer pagingSelect = new StringBuffer( sql.length()+100 );  
  11.   if (hasOffset) {  
  12.    pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");  
  13.   }  
  14.   else {  
  15.    pagingSelect.append("select * from ( ");  
  16.   }  
  17.   pagingSelect.append(sql);  
  18.   if (hasOffset) {  
  19.    pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?");  
  20.   }  
  21.   else {  
  22.    pagingSelect.append(" ) where rownum <= ?");  
  23.   }  
  24.  
  25.   if ( isForUpdate ) {  
  26.    pagingSelect.append( " for update" );  
  27.   }  
  28.     
  29.   return pagingSelect.toString();  
  30.  }  
  31.  

通過Oracle特有的rownum子句來實現數據部分的讀取。SQLServerDialect中的getLimitString實現:

  1. public String getLimitString(String querySelect, int offset, int limit) {  
  2.   if ( offset > 0 ) {  
  3.    throw new UnsupportedOperationException( "sql server has no offset" );  
  4.   }  
  5.   return new StringBuffer( querySelect.length()+8 )  
  6.    .append(querySelect)  
  7.    .insert( getAfterSelectInsertPoint(querySelect), " top " + limit )  
  8.    .toString();  
  9.  }  

通過SQLServer特有的top子句實現。HSQLDialect中的getLimitString實現:

  1. public String getLimitString(String sql, boolean hasOffset) {  
  2.   return new StringBuffer( sql.length() + 10 )  
  3.     .append( sql )  
  4.     .insert( sql.toLowerCase().indexOf( "select" ) + 6, hasOffset ? " limit ? ?" : " top ?" )  
  5.     .toString();  
  6.  }  


大多數主流數據庫都提供了數據部分讀取機制,而對于某些沒有提供相應機制的數據庫而言,Hibernate也通過其他途徑實現了分頁,如通過Scrollable ResultSet,如果JDBC不支持Scrollable ResultSet,Hibernate也會通過ResultSet的next方法進行記錄定位。Hibernate通過底層對分頁機制的良好封裝,使得開發人員無需關心數據分頁的細節實現,將數據邏輯和存儲邏輯分離開來,在提高生產效率的同時,也大大加強了系統在不同數據庫平臺之間的可移植性。

【編輯推薦】

  1. 如何解決Struts Hibernate的整合問題
  2. 對Hibernate中get()與load()不同點分析
  3. Struts-Spring-Hibernate案例
  4. 簡述Hibernate配置連接池
  5. 對Hibernate中get()與load()不同點分析

 

責任編輯:仲衡 來源: baidu
相關推薦

2009-09-21 18:13:11

Hibernate S

2009-09-28 17:23:51

Hibernate E

2009-09-21 17:23:49

Hibernate使用

2009-09-24 11:41:46

Hibernate延遲

2009-09-22 13:09:06

Hibernateorm框架

2009-09-21 12:50:34

Hibernate架構

2009-09-23 17:28:55

Hibernate C

2009-09-22 10:23:15

Hibernate配置

2009-09-22 17:32:38

Hibernate A

2009-09-23 13:26:10

Hibernate對象

2009-09-24 10:07:21

Hibernate M

2009-06-17 14:55:26

Hibernate數據

2009-09-23 11:07:11

Hibernate基礎

2009-06-11 14:40:59

Hibernate分頁Hibernate查詢

2009-06-25 17:24:06

Hibernate主鍵

2009-09-22 15:26:30

Hibernate多表

2009-09-25 10:49:25

Hibernate加載

2009-09-29 16:11:45

Hibernate實現

2009-09-24 13:39:06

Hibernate VHibernate P

2009-09-22 14:44:18

Hibernate.c
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日p视频免费看 | 午夜成人免费视频 | 久久精品毛片 | 国产精品久久久久久久久久久久久 | 亚洲精品一区二区三区中文字幕 | 午夜影院网站 | 久久看片| 请别相信他免费喜剧电影在线观看 | 一区二区精品 | 日韩欧美在线观看 | 精品av | www久久久 | 国产网站久久 | 成人免费精品 | 欧美午夜激情在线 | av资源中文在线天堂 | 男女免费视频网站 | 狠狠干影院 | 日本午夜一区二区三区 | 毛片免费观看 | 国产日韩一区二区三免费高清 | 色综合区 | 亚洲精品一区二区在线观看 | 国产精品日韩在线观看 | 欧美一级二级视频 | 男女又爽又黄视频 | 久久久久久综合 | 国产精品自产拍 | 亚洲精品一| 亚洲福利网站 | 久久久成人精品 | 久久久久久91 | 欧美理论片在线 | 中文在线视频 | 免费在线观看成人 | wwwxxx日本在线观看 | 国产欧美日韩一区二区三区在线 | 欧美日韩精品中文字幕 | 97伦理 | 成人午夜免费福利视频 | 在线一级片 |