实现Hibernate分页查询原理解读
Hibernate 可以实现分页查询,例如: 从第2万条开始取出100条记录Query q = session.createQuery(from Cat as c);q.setFirstResult(20000);q.setMax..
Hibernate 可以实现分页查询,例如:
从第2万条开始取出100条记录
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行以下:
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(100); pagingSelect.append(sql); pagingSelect.append(" limit ?, ?"); return pagingSelect.toString(); } |
这是MySQL的专用分页语句,再来看net.sf.hibernate.dialect.Oracle9Dialect:
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行以下:
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的一大好处是,既兼顾了查询分页的性能,同时又保证了代码在不同的数据库之间的可移植性。
分享到:
相关推荐
Hibernate分页查询原理解读 , 忘记以前在哪看的了, 现在贴出来和大家分享一下。
Hibernate分页查询小结
STRUTS2+HIBERNATE分页 实现代码详细的分页实现代码实现代码详细的分页实现代码实现代码详细的分页实现代码实现代码详细的分页实现代码
hibernate分页查询 数据库连接,不错的分析,可以尝试下载易用。。
Struts2+Sprint+Hibernate分页查询功能,实现过程步骤完整。
hibernate 分页查询的实现 hibernate 内置的有分页功能 有三个参数 thisnumber一个是当前页数 sumcount是一页显示多少条数据 sql是用来查询的sql语句 public List getPageList(int thisNumber, int sumCount, ...
hibernate分页Hibernate 分页的设计和编码
Hibernate HQL查询 分页查询 模糊查询.docxHibernate HQL查询 分页查询 模糊查询.docxHibernate HQL查询 分页查询 模糊查询.docxHibernate HQL查询 分页查询 模糊查询.docxHibernate HQL查询 分页查询 模糊查询....
hibernate分页查询,里面包含数据库。自己写的。能正常运行。
分页查询就是把数据库中某张表的记录数进行分页查询,在做分页查询时会有一个Page类,下面是一个Page类,我对其做了详细的注解:。。。。。。。。。。。。
这是用Struts+Hibernate实现的分页及查询
使用hibernate对list等进行分页查询的完整页面代码,希望能帮助大家,同时有什么疑问的话,希望大家多多指正和给出建议或意见。
ExtJs4.2+Mysql+Struts2+Hibernate3实现分页查询 1.libs目录缺少hibernate核心jar包 2.libs目录缺少struts jar 3.WebRoot目录缺少ExtJs4.2核心类库 以上信息我都在项目里面注明了,因为这些内容的文件太大了,CSDN不...
Struts+Hibernate实现分页.
Hibernate 实现原理 模拟,通过模拟hibernate的实现原理来加深对hibernate实现原理的理解和使用。
hibernate分页(无排序,搜索,仅仅分页显示),服务器端分页在datatables上展现,有关 datatables的知识请关注它的官网http://www.datatables.net/,datatables的功能很 全面。 2,建表的sql--studentinfo和插入...
使用hibernate实现的分页效果 orm 映射 session 等技能点 带有注释和案例演示 表生成语句
用户Hibernate实现的一个分页 希望对大家有用哦!!!
webwork2.2.7+spring+hibernate分页查询 通过输入用户名获取数据并进行分页
一个用springmvc+hibernate+spring maven实现的增、删、改、查的例子