分页在任何系统中都是非常头疼的事情,有的数据库在语法上支持分页,而有的数据库则需要使用可滚动游标来实现,并且在不支持可滚动游标的系统上只能使用单向游标逐步接近要取得的数据。
Hibernate提供了一个支持跨系统的分页机制,这样无论底层是什么样的数据库都能用统一的接口进行分页操作。比如下面的代码就是从第500条开始取出100条记录:
Query q = session.createQuery("from FooBar as f");
q.setFirstResult(500);
q.setMaxResults(100);
List l = q.list();
那么Hibernate底层如何实现分页的呢?Hibernate根据Query拼装SQL语句的地方是在org.hibernate.loader.Loader类的prepareQueryStatement方法中,对分页支持的代码在这一段中可以发现:
if (useLimit)
{
sql = dialect.getLimitString(
sql.trim(), //use of trim() here is ugly?
useOffset ? getFirstRow(selection) : 0,
getMaxOrLimit(selection, dialect)
);
}
此处调用Dialect的getLimitString方法来得到不同平台的分页语句。
在MySQLDialect中是如下实现getLimitString方法的:
public String getLimitString(String sql, boolean hasOffset)
{
return new StringBuffer( sql.length()+20 )
.append(sql)
.append( hasOffset ? " limit ?, ?" : " limit ?")
.toString();
}
这是MySQL的专用分页语句,再来看Oracle9Dialect:
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采用嵌套3层的查询语句结合rownum来实现分页,这在Oracle上是最好的方式,因为如果只是一层或者两层的查询语句的rownum不能支持order by。
此外Interbase,PostgreSQL,HSQL等也在语法级别上支持分页,具体实现可以查看相应的Dialect实现。如果数据库不支持分页的SQL语句,那么如果数据库支持可滚动游标,那么Hibernate就会采使用ResultSet的absolute方法直接移到查询起点;否则使用循环语句,通过rs.next一步步移动到要查询的数据处:
final int firstRow = getFirstRow( selection );
if ( firstRow != 0 )
{
if ( getFactory().getSettings().isScrollableResultSetsEnabled() )
{
// 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();
}
}
可见使用Hibernate,在进行查询分页的操作上,是具有非常大的灵活性,Hibernate会首先尝试用特定数据库的分页sql,如果没用,再尝试Scrollable,如果不支持Scrollable再采用rset.next()移动的办法。这样既兼顾了查询分页的性能,同时又保证了代码在不同的数据库之间的可移植性。
分享到:
相关推荐
hibernate分页技术是数据库操作中的重要一环,它能有效地提高数据查询效率,减少不必要的数据传输,优化用户体验。在使用Hibernate这个流行的Java ORM框架时,我们可以利用其内置的功能来实现分页查询。 首先,我们...
在分页技术中,我们通常需要考虑以下几个关键点: 1. **数据查询**:Hibernate通过SQL查询获取数据,它可以动态生成SQL语句,或者允许开发者自定义SQL以适应特定的数据库。在这个项目中,可能会有一个`Query`对象或...
标题与描述均提到了“Hibernate分页的设计和编码”,这表明文章主要聚焦于如何在Hibernate框架中实现数据分页功能。下面将详细解析这一主题的关键知识点。 ### Hibernate分页概念 Hibernate是Java环境下一个开放源...
### Hibernate 分页技术详解 #### 一、分页概述与应用场景 在开发Web应用程序时,为了提高用户体验并减轻服务器压力,通常需要对查询结果进行分页处理。Hibernate作为一款流行的Java持久层框架,提供了多种方式...
### 基于Hibernate实现的分页技术 在软件开发领域,特别是在J2EE应用程序中,数据展示往往需要处理大量的记录。为了提升用户体验并减轻服务器...希望本文能为正在探索Hibernate分页技术的开发者们提供一定的参考价值。
JAVA分页大全.doc Hibernate分页查询.doc hibernate实现分页技术.txt struts实现分页技术源代码txt Struts+hibernate制作分页的问题txt spring+struts+hibernate ...spring+hibernate分页技术.txt jsp实现分页技术.txt
分页是一种常见的技术手段,用于在数据量较大时提高用户体验。其实现的基本思路是将数据分割成多个小部分,每次只显示其中的一部分数据。用户可以通过翻页操作来查看其他部分的数据。 #### Struts2与Hibernate在...
你可以利用上述的Hibernate分页查询技术,针对这些数据进行分页操作,以实现高效、便捷的数据展示。 总结,Hibernate的分页查询是其强大功能的一部分,通过Criteria API、HQL或自定义SQL,我们可以轻松地在Java应用...
### Hibernate分页技术详解 #### 一、概述 在现代软件开发中,特别是Web应用程序,分页是一项非常重要的功能。它不仅可以提高用户体验,还可以优化数据处理效率,避免一次性加载大量数据导致性能问题。Hibernate...
4. 性能优化:考虑使用缓存技术,如Hibernate的二级缓存,减少对数据库的访问次数。 通过以上步骤和注意事项,我们可以实现一个高效且用户体验良好的分页功能。在实际项目中,这样的实现有助于提升应用的易用性和可...
通过对这些文件的分析和学习,开发者可以更好地理解和应用Spring、Hibernate和MySQL的分页技术。 总的来说,结合Spring、Hibernate和MySQL的分页功能,不仅可以有效地管理大量数据,提高查询效率,还能提供良好的...
在"Struts+Hibernate分页及条件查询练习"这个项目中,开发者可能采用了以下步骤: 1. **配置Struts和Hibernate**:首先,需要在项目中引入Struts和Hibernate的相关库,配置Struts的struts-config.xml文件和...
### Hibernate分页基础 1. **Criteria API**:Hibernate的Criteria API允许我们创建动态查询,同时也支持分页。通过设置`setFirstResult()`和`setMaxResults()`方法,可以实现分页效果。例如: ```java Criteria ...
一、Hibernate分页基础 1. Hibernate的Query和Criteria API都提供了分页功能。使用`setFirstResult()`方法设置查询开始的位置,即第几条记录,以及`setMaxResults()`方法设置一次返回的最大记录数,这两者结合即可...
本篇主要围绕"Hibernate分页查询效果"这一主题,深入探讨如何利用Hibernate框架实现高效、便捷的分页功能。 首先,Hibernate是一个优秀的Java持久化框架,它提供了ORM(对象关系映射)解决方案,使得开发者可以使用...
在IT行业中,开发高效、可扩展的Web应用是至关重要的,...总之,"高效率的dw+spring+hibernate分页演示例子"是一个深入理解现代Java Web开发中重要技术的绝佳实践,对于提升开发技能和掌握企业级应用开发有极大的帮助。
【标题】:Hibernate分页(Eclipse项目) 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作。本项目主要关注如何在使用Hibernate时实现分页功能,这对于处理大数据集的Web应用尤其...
这篇内容我们将深入探讨如何在SSH框架下实现高效的分页技术。 首先,Struts2作为MVC(Model-View-Controller)框架,主要负责处理用户请求并转发到相应的Action,Action再调用业务逻辑。在分页场景中,Struts2可以...