`
- 浏览:
187544 次
- 性别:
- 来自:
商丘
-
Hibernate分页
Hibernate中,通过对不同数据库的统一接口设计,实现了透明化、通用化的分页实现机制。
通过Criteria.setFirstResult和Criteria.setFetchSize方法设定分页范围,如:
Criteria criteria = session.createCriteria(TUser.class);
criteria.add(Expression.eq("age", "20"));
//从检索结果中获取第100条记录开始的20条记录
criteria.setFirstResult(100);
criteria.setFetchSize(20);
通过Query.setFirstResult和Query.setMaxResults方法也可以设定分页范围,如:
Query query = session.createQuery("from TUser");
query.setFirstResult(100);
query.setMaxResults(20); // query.setFetchSize(20);
List list = query.list();
Hibernate中,抽象类org.hibernate.dialect.Dialect指定了所有底层数据库的对外统一接口,通过针对不同数据库提供相应的Dialect实现,数据库之间的差异性得以消除,从而为上层机制提供了透明的、数据库无关的存储层基础。
对于分页机制而言,Dialect中定义了一个方法如下:
/**
* Add a LIMIT clause to the given SQL SELECT
*
* @return the modified SQL
*/
public String getLimitString(String querySelect, boolean hasOffset) {
throw new UnsupportedOperationException( "paged queries not supported" );
}
public String getLimitString(String querySelect, int offset, int limit) {
return getLimitString( querySelect, offset>0 );
}
此方法用于在现有Select语句基础上,根据各个数据库自身特性,构造对应的记录返回限定子句。如MySQL中对应的记录限定子句为Limit,Oracle中,通过rownum子句实现。
MySQLDialect中的getLimitString实现:
public String getLimitString(String sql, boolean hasOffset) {
return new StringBuffer( sql.length()+20 )
.append(sql)
.append( hasOffset ? " limit ?, ?" : " limit ?")
.toString();
}
MySQLDialect.getLimitString方法的实现实际上是在给定的Select语句后追加MySQL所提供的专有SQL子句limit来实现。
Oracle9Dialect中的getLimitString实现:
public String getLimitString(String sql, boolean hasOffset) {
sql = sql.trim();
boolean isForUpdate = false;
if ( sql.toLowerCase().endsWith(" for update") ) {
sql = sql.substring( 0, sql.length()-11 );
isForUpdate = true;
}
StringBuffer pagingSelect = new StringBuffer( sql.length()+100 );
if (hasOffset) {
pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");
}
else {
pagingSelect.append("select * from ( ");
}
pagingSelect.append(sql);
if (hasOffset) {
pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?");
}
else {
pagingSelect.append(" ) where rownum <= ?");
}
if ( isForUpdate ) {
pagingSelect.append( " for update" );
}
return pagingSelect.toString();
}
通过Oracle特有的rownum子句来实现数据部分的读取。
SQLServerDialect中的getLimitString实现:
public String getLimitString(String querySelect, int offset, int limit) {
if ( offset > 0 ) {
throw new UnsupportedOperationException( "sql server has no offset" );
}
return new StringBuffer( querySelect.length()+8 )
.append(querySelect)
.insert( getAfterSelectInsertPoint(querySelect), " top " + limit )
.toString();
}
通过SQLServer特有的top子句实现。
HSQLDialect中的getLimitString实现:
public String getLimitString(String sql, boolean hasOffset) {
return new StringBuffer( sql.length() + 10 )
.append( sql )
.insert( sql.toLowerCase().indexOf( "select" ) + 6, hasOffset ? " limit ? ?" : " top ?" )
.toString();
}
大多数主流数据库都提供了数据部分读取机制,而对于某些没有提供相应机制的数据库而言,Hibernate也通过其他途径实现了分页,如通过Scrollable ResultSet,如果JDBC不支持Scrollable ResultSet,Hibernate也会通过ResultSet的next方法进行记录定位。
Hibernate通过底层对分页机制的良好封装,使得开发人员无需关心数据分页的细节实现,将数据逻辑和存储逻辑分离开来,在提高生产效率的同时,也大大加强了系统在不同数据库平台之间的可移植性。
抄袭资料:《深入浅出Hibernate》
Hibernate reference
Hibernate api
Hibernate src
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
Hibernate分页查询小结
hibernate分页Hibernate 分页的设计和编码
hibernate分页查询 数据库连接,不错的分析,可以尝试下载易用。。
Hibernate分页查询原理解读 , 忘记以前在哪看的了, 现在贴出来和大家分享一下。
hibernate分页(无排序,搜索,仅仅分页显示),服务器端分页在datatables上展现,有关 datatables的知识请关注它的官网http://www.datatables.net/,datatables的功能很 全面。 2,建表的sql--studentinfo和插入...
STRUTS2+HIBERNATE分页 实现代码详细的分页实现代码实现代码详细的分页实现代码实现代码详细的分页实现代码实现代码详细的分页实现代码
hibernate分页查询,里面包含数据库。自己写的。能正常运行。
传统的网页设计只在一个JSP或者ASP页面中书写所有关于数据库操作的代码,那样做分页可能简单一点,但当把网站分层开发后,分页就比较困难了,下面是我做Spring+Hibernate+Struts2项目时设计的分页代码,与大家分享...
hibernate分页代码,直接能在myeclipse上运行的好东西
spring+hibernate 分页 +mysql 可以当做模板用。
hibernate分页 博文链接:https://iomo.iteye.com/blog/243518
java 实现的一个简单的hibernate分页类 可以设置,从某一条开始取、显示的条数 不依赖struts spring
hibernate分页
Hibernate分页
Struts+Hibernate分页标签 Struts+Hibernate分页标签
Hibernate分页教学视频 Hibernate分页教学视频 Hibernate分页教学视频
这是一个类,可以通用,只要传入两个参数即可,一个是...Query query是hibernate中session创建的query;字符char ch代表操作:‘a’就是all全部,'n'就是next下一页,'u'就是up上一页;'e'就是end末页,'s'就是start首页
Struts2+Sprint+Hibernate分页查询功能,实现过程步骤完整。
Hibernate分页可能引起的性能问题 在使用Hibernate进行分页的过程中,如果你收到如下警告,那么这里就是一个潜在的性能问题点: WARNING: firstResult/maxResults specified with collection fetch; applying in ...