摘自:http://dev.yesky.com/SoftChannel/72342371961929728/20041031/1870256.shtml
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() ) {
-
- rs.absolute(firstRow);
- }
else
{
-
-
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+Sprint+Hibernate分页查询功能,实现过程步骤完整。
STRUTS2+HIBERNATE分页 实现代码详细的分页实现代码实现代码详细的分页实现代码实现代码详细的分页实现代码实现代码详细的分页实现代码
hibernate分页Hibernate 分页的设计和编码
Hibernate HQL查询 分页查询 模糊查询.docxHibernate HQL查询 分页查询 模糊查询.docxHibernate HQL查询 分页查询 模糊查询.docxHibernate HQL查询 分页查询 模糊查询.docxHibernate HQL查询 分页查询 模糊查询....
hibernate分页查询,里面包含数据库。自己写的。能正常运行。
使用hibernate对list等进行分页查询的完整页面代码,希望能帮助大家,同时有什么疑问的话,希望大家多多指正和给出建议或意见。
这是用Struts+Hibernate实现的分页及查询
webwork2.2.7+spring+hibernate分页查询 通过输入用户名获取数据并进行分页
struts2+spring+hibernate分页查询
hibernate 分页查询的实现 hibernate 内置的有分页功能 有三个参数 thisnumber一个是当前页数 sumcount是一页显示多少条数据 sql是用来查询的sql语句 public List getPageList(int thisNumber, int sumCount, ...
使用hibernate实现的分页效果 orm 映射 session 等技能点 带有注释和案例演示 表生成语句
一个用springmvc+hibernate+spring maven实现的增、删、改、查的例子
分页查询效果。。。。。。。。。。。。。。。。。
分页查询就是把数据库中某张表的记录数进行分页查询,在做分页查询时会有一个Page类,下面是一个Page类,我对其做了详细的注解:。。。。。。。。。。。。
Hibernate 多表连接分页查询示范项目 Hibernate Criteria 多表连接 分页
struts+hibernate分页 模糊查询 author:朱千平 phone:13522080786 qq:200896066
hibernate分页(无排序,搜索,仅仅分页显示),服务器端分页在datatables上展现,有关 datatables的知识请关注它的官网http://www.datatables.net/,datatables的功能很 全面。 2,建表的sql--studentinfo和插入...