您现在的位置是:首页
>
分页查询怎么实现 如何用 Hibernate 实现分页查询
如何用 Hi er ate 实现分页查询 例如 从第 万条开始取出 条记录 代码: Query q = e io createQuery from Cat a c

如何用 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 很赞哦! (1033)