您现在的位置是:首页 >

分页查询怎么实现 如何用 Hibernate 实现分页查询

火烧 2021-11-08 12:00:20 1033
如何用 Hi er ate 实现分页查询   例如   从第 万条开始取出 条记录       代码:     Query q = e io createQuery from Cat a c     
分页查询怎么实现 如何用 Hibernate 实现分页查询

如何用 Hibernate 实现分页查询  

  例如   从第 万条开始取出 条记录       代码:     Query q = session createQuery( from Cat as c );     q setFirstResult( );     q setMaxResults( );     List l = q list();    那么Hibernate底层如何实现分页的呢?实际上Hibernate的查询定义在net sf hibernate loader Loader这个类里面 仔细阅读该类代码 就可以把问题彻底搞清楚     Hibernate 的Loader源代码第 行以下        代码:     if (useLimit) sql = dialect getLimitString(sql);     PreparedStatement st = session getBatcher() prepareQueryStatement(sql   scrollable);      如果相应的数据库定义了限定查询记录的sql语句 那么直接使用特定数据库的sql语句     然后来看net sf hibernate dialect MySQLDialect:       代码:     public boolean supportsLimit() {      return true;     }     public String getLimitString(String sql) {      StringBuffer pagingSelect = new StringBuffer( );      pagingSelect append(sql);      pagingSelect append( limit ? ? );      return pagingSelect toString();     }    这是MySQL的专用分页语句 再来看net sf hibernate dialect Oracle Dialect:       代码:     public boolean supportsLimit() {      return true;     }       public String getLimitString(String sql) {      StringBuffer pagingSelect = new StringBuffer( );      pagingSelect append( select * from ( select row_ * rownum rownum_  from ( );      pagingSelect append(sql);      pagingSelect append( ) row_ where rownum <= ?) where rownum_ > ? );      return pagingSelect toString();     }    Oracle采用嵌套 层的查询语句结合rownum来实现分页 这在Oracle上是最快的方式 如果只是一层或者两层的查询语句的rownum不能支持order by     除此之外 Interbase PostgreSQL HSQL也支持分页的sql语句 在相应的Dialect里面 大家自行参考     如果数据库不支持分页的SQL语句 那么根据在配置文件里面#hibernate jdbc use_scrollable_resultset true默认是true 如果你不指定为false 那么Hibernate会使用JDBC 的scrollableresult来实现分页 看Loader第 行以下        代码:     if ( session getFactory() useScrollableResultSets() ) {      // we can go straight to the first required row      rs absolute(firstRow);     }     else {      // we need to step through the rows one row at a time (slow)      for ( int m= ; m<firstRow; m++ ) rs next();     }    如果支持scrollable result 使用ResultSet的absolute方法直接移到查询起点 如果不支持的话 使用循环语句 rs next一点点的移过去     可见使用Hibernate 在进行查询分页的操作上 是具有非常大的灵活性 Hibernate会首先尝试用特定数据库的分页sql 如果没用 再尝试Scrollable 如果不行 最后采用rset next()移动的办法     在查询分页代码中使用Hibernate的一大好处是 既兼顾了查询分页的性能 同时又保证了代码在不同的数据库之间的可移植性 lishixinzhi/Article/program/Java/ky/201311/28262  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码