Hibernate实现分页查询的扼要阐明
本文向各人先容Hibernate查询分页,大概许多几何人还不相识Hibernate查询分页,没有干系,下面有一个例子,从第2万条开始取出100笔记录看完本文你必定有不少收获,但愿本文能教会你更多对象。
Java代码
Query q = session.createQuery("from Cat as c");;
q.setFirstResult(20000);;
q.setMaxResults(100);;
List l = q.list();;
那么Hibernate底层如何实现分页的呢?实际上Hibernate的查询界说在net.sf.hibernate.loader.Loader这个类内里,仔细阅读该类代码,就可以把问题彻底搞清楚。
Hibernate2.0.3的Loader源代码第480行以下:
Java代码
if (useLimit); sql = dialect.getLimitString(sql);;
PreparedStatement st = session.getBatcher();.prepareQueryStatement(sql, scrollable);;
假如相应的数据库界说了限定查询记录的sql语句,那么直接利用特定命据库的sql语句。
然厥后看net.sf.hibernate.dialect.MySQLDialect:
Java代码
public boolean supportsLimit(); {
return true;
}
public String getLimitString(String sql); {
StringBuffer pagingSelect = new StringBuffer(100);;
pagingSelect.append(sql);;
pagingSelect.append(" limit ?, ?");;
return pagingSelect.toString();;
}
这是MySQL的专用分页语句,再来看net.sf.hibernate.dialect.Oracle9Dialect:
Java代码
public boolean supportsLimit(); {
return true;
}
public String getLimitString(String sql); {
StringBuffer pagingSelect = new StringBuffer(100);;
pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");;
pagingSelect.append(sql);;
pagingSelect.append(" ); row_ where rownum <= ?); where rownum_ > ?");;
return pagingSelect.toString();;
}
Oracle回收嵌套3层的查询语句团结rownum来实现分页,这在Oracle上是最快的方法,假如只是一层可能两层的查询语句的rownum不能支持order by。
除此之外,Interbase,PostgreSQL,HSQL也支持分页的sql语句,在相应的Dialect内里,各人自行参考。
假如数据库不支持分页的SQL语句,那么按照在设置文件内里 #hibernate.jdbc.use_scrollable_resultset true
默认是true,假如你不指定为false,那么Hibernate会利用JDBC2.0的scrollable result来实现分页,看Loader第430行以下:
Java代码
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=0; m<firstRow; m++ ); rs.next();;
}
假如支持scrollable result,利用ResultSet的absolute要领直接移到查询起点,假如不支持的话,利用轮回语句,rs.next一点点的移已往。
可见利用Hibernate,在举办查询分页的操纵上,是具有很是大的机动性,Hibernate会首先实验用特定命据库的分页sql,假如没用,再实验Scrollable,假如不可,最后回收rset.next()移动的步伐。
在查询分页代码中利用Hibernate查询分页的一大长处是,既分身了查询分页的机能,同时又担保了代码在差异的数据库之间的可移植性。