`

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的scrollableresult来实现分页,看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的一大好处是,既兼顾了查询分页的性能,同时又保证了代码在不同的数据库之间的可移植性。

分享到:
评论

相关推荐

    java+hibernate实现分页

    java+hibernate实现分页 public String execute() throws Exception { System.out.println("Page:" + page); pagePlanList = ps.findPlantByPage(page, rowsPerPage); totalPage = ps.getPlanTotalPage...

    用Hibernate实现分页查询.docx

    ### 使用Hibernate实现分页查询 #### 一、分页查询概念及原理 分页查询是一种在数据量较大的情况下,为了提高用户体验和系统性能而采取的一种技术手段。它将查询结果分成若干页显示,用户可以通过翻页操作查看不同...

    hibernate实现分页查询

    ### Hibernate 实现分页查询详解 #### 一、引言 在进行数据库操作时,为了提高用户体验和系统性能,分页查询是一项非常重要的技术。...以上就是关于Hibernate实现分页查询的具体介绍,希望对大家有所帮助。

    完整Struts2 HIBERNATE实现分页

    根据提供的标题、描述以及部分内文,我们可以梳理出关于如何使用Struts2与Hibernate实现分页功能的关键知识点。 ### Struts2与Hibernate简介 - **Struts2**:这是一个基于MVC架构的开源Web框架,它能帮助开发者...

    Struts2+HIBERNATE实现分页(完整讲解)

    【Struts2+Hibernate实现分页详解】 在Java Web开发中,Struts2和Hibernate是两个非常重要的框架,它们分别负责MVC模式中的控制层和持久层。Struts2提供了强大的Action类和拦截器,使得业务逻辑处理更加简洁;而...

    Extjs+Spring+Hibernate实现分页

    本项目“Extjs+Spring+Hibernate实现分页”结合了三种强大的技术,以构建一个高效、灵活的数据分页系统。下面将详细介绍这三个技术以及它们在分页中的应用。 1. **ExtJS**:ExtJS是一个JavaScript库,专门用于构建...

    Struts+Hibernate实现分页

    在Java Web开发中,"Struts+Hibernate 实现分页"是一个常见的需求,尤其是在处理大量数据展示时。...通过研究这些文件,你可以更好地理解和学习如何在实际项目中结合Struts和Hibernate实现分页功能。

    strut+hibernate实现分页源码

    本篇文章将深入探讨如何在Struts框架中利用Hibernate实现分页功能,以提高应用性能和用户体验。 分页是大型数据集展示的关键技术,它允许用户逐步浏览大量信息,而不是一次性加载所有数据,这可以显著提升页面加载...

    struts+hibernate实现分页.rar

    本项目“struts+hibernate实现分页”结合了这两个强大的工具,旨在展示如何在实际应用中实现数据的分页显示,以提高用户体验并优化系统性能。 分页是Web应用程序中常见的功能,特别是在处理大量数据时。它将数据库...

    hibernate 实现分页

    本教程将详细介绍如何使用Hibernate实现分页功能。 首先,我们需要了解分页的基本概念。分页是将一个大的数据集分割成多个小的部分,每个部分称为一页。用户每次只加载一页数据,可以按需浏览或跳转到其他页。在...

    用户Hibernate实现的一个分页

    本教程将详细讲解如何使用Hibernate实现分页功能,这对于处理大量数据的Web应用来说至关重要,因为它能够有效地减少数据库负载,提高用户体验。 一、Hibernate分页基础 1. Hibernate的Query和Criteria API都提供了...

    sh分页sh分页

    hibernate分页

    spring+struts+hibernate实现分页

    以下将详细讲解如何使用这三个框架实现分页功能。 首先,Spring作为核心的依赖注入(DI)和面向切面编程(AOP)框架,负责管理应用程序的组件,包括SessionFactory的创建和管理。在配置文件中,我们可以通过Spring...

    STRUTS2+HIBERNATE详细的分页实现代码详细的分页实现代码

    根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要探讨的是如何在Struts2与Hibernate框架结合下实现分页功能。接下来将详细解析Struts2与Hibernate如何协作完成这一任务。 ### Struts2与Hibernate...

    ExtJs4.2+Mysql+Struts2+Hibernate3实现分页查询

    ExtJs4.2+Mysql+Struts2+Hibernate3实现分页查询 1.libs目录缺少hibernate核心jar包 2.libs目录缺少struts jar 3.WebRoot目录缺少ExtJs4.2核心类库 以上信息我都在项目里面注明了,因为这些内容的文件太大了,CSDN不...

    Struts + Hibernate 实现简单分页功能

    总的来说,使用Struts和Hibernate实现分页功能,需要结合MVC模式和ORM思想,合理设计数据访问层和业务逻辑层,同时确保前端与后端的有效通信。这个过程涉及到了Java编程、数据库操作、框架理解和页面渲染等多个方面...

    hibernate商品分页展示

    **二、使用Hibernate实现分页** 在Hibernate中,我们可以使用`Criteria`、`Query`或者`JPQL`(Java Persistence Query Language)来实现分页。这里以`Criteria`为例: 1. **创建Criteria**:首先,我们需要通过...

    dwr+hibernate实现的分页技术

    #### 四、dwr+hibernate实现分页技术的关键步骤 ##### 4.1 准备工作 在开始之前,确保项目中已经集成了dwr和hibernate两个框架。这通常涉及到添加相应的依赖库以及配置文件的设置。对于dwr,主要是引入必要的...

Global site tag (gtag.js) - Google Analytics