熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

如何用 Hibernate 實現分頁查詢

2013-11-23 20:18:43  來源: Java開源技術 

  例如
  從第萬條開始取出條記錄
  
     代碼:
     Query q = sessioncreateQuery(from Cat as c);
     qsetFirstResult();
     qsetMaxResults();
     List l = qlist();
  
  那麼Hibernate底層如何實現分頁的呢?實際上Hibernate的查詢定義在netsfhibernateloaderLoader這個類裡面仔細閱讀該類代碼就可以把問題徹底搞清楚
  
  Hibernate的Loader源代碼第行以下
  
     代碼:
     if (useLimit) sql = dialectgetLimitString(sql);
     PreparedStatement st = sessiongetBatcher()prepareQueryStatement(sql
  scrollable);
  
  
  如果相應的數據庫定義了限定查詢記錄的sql語句那麼直接使用特定數據庫的sql語句
  
  然後來看netsfhibernatedialectMySQLDialect:
  
     代碼:
     public boolean supportsLimit() {
      return true;
     }
     public String getLimitString(String sql) {
      StringBuffer pagingSelect = new StringBuffer();
      pagingSelectappend(sql);
      pagingSelectappend( limit ? ?);
      return pagingSelecttoString();
     }
  
  這是MySQL的專用分頁語句再來看netsfhibernatedialectOracleDialect:
  
     代碼:
     public boolean supportsLimit() {
      return true;
     }
  
     public String getLimitString(String sql) {
      StringBuffer pagingSelect = new StringBuffer();
      pagingSelectappend(select * from ( select row_* rownum rownum_
  from ( );
      pagingSelectappend(sql);
      pagingSelectappend( ) row_ where rownum <= ?) where rownum_ > ?);
      return pagingSelecttoString();
     }
  
  Oracle采用嵌套層的查詢語句結合rownum來實現分頁這在Oracle上是最快的方式如果只是一層或者兩層的查詢語句的rownum不能支持order by
  
  除此之外InterbasePostgreSQLHSQL也支持分頁的sql語句在相應的Dialect裡面大家自行參考
  
  如果數據庫不支持分頁的SQL語句那麼根據在配置文件裡面#hibernatejdbcuse_scrollable_resultset true默認是true如果你不指定為false那麼Hibernate會使用JDBC的scrollableresult來實現分頁看Loader第行以下
  
     代碼:
     if ( sessiongetFactory()useScrollableResultSets() ) {
      // we can go straight to the first required row
      rsabsolute(firstRow);
     }
     else {
      // we need to step through the rows one row at a time (slow)
      for ( int m=; m<firstRow; m++ ) rsnext();
     }
  
  如果支持scrollable result使用ResultSet的absolute方法直接移到查詢起點如果不支持的話使用循環語句rsnext一點點的移過去
  
  可見使用Hibernate在進行查詢分頁的操作上是具有非常大的靈活性Hibernate會首先嘗試用特定數據庫的分頁sql如果沒用再嘗試Scrollable如果不行最後采用rsetnext()移動的辦法
  
  在查詢分頁代碼中使用Hibernate的一大好處是既兼顧了查詢分頁的性能同時又保證了代碼在不同的數據庫之間的可移植性
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28262.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.