`
isiqi
  • 浏览: 16711772 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Hibernate分页查询原理

阅读更多

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分页查询实现原理 ##### 3.1 使用SQL LIMIT实现分页 对于支持LIMIT关键字的数据库(例如MySQL),Hibernate会通过特定的方言(Dialect)来生成包含LIMIT关键字的SQL语句。具体实现如下: ```...

    hibernate分页查询

    一、Hibernate分页原理 Hibernate分页查询基于SQL的LIMIT和OFFSET子句,通过Session的createQuery或createSQLQuery方法创建查询,并设置FirstResult和MaxResults属性来实现分页。FirstResult表示从结果集的第几个...

    JQuery,ajax,hibernate+spring,分页查询.rar

    至于“Hibernate分页查询原理解读”,这可能是一个深入解析Hibernate分页机制的文档,包括`FirstResult`和`MaxResults`参数的使用,以及如何有效地缓存查询结果以提高性能。 综合来看,这个压缩包包含了一系列关于...

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

    #### 分页原理概述 分页是一种常见的技术手段,用于在数据量较大时提高用户体验。其实现的基本思路是将数据分割成多个小部分,每次只显示其中的一部分数据。用户可以通过翻页操作来查看其他部分的数据。 #### ...

    hibernate实现分页查询

    #### 二、分页查询的基本原理 分页查询的核心思想是通过限制SQL查询结果的数量来实现分页效果。通常,我们需要确定两个关键参数:当前页数(`thisNumber`)和每页显示的记录数(`sumCount`)。基于这两个参数,我们...

    用Hibernate实现分页查询.docx

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

    hibernate实现分页

    ### Hibernate分页基础 1. **Criteria API**:Hibernate的Criteria API允许我们创建动态查询,同时也支持分页。通过设置`setFirstResult()`和`setMaxResults()`方法,可以实现分页效果。例如: ```java Criteria ...

    hibernate分页

    ### 一、Hibernate分页原理 在关系数据库中,分页通常通过SQL的`LIMIT`和`OFFSET`关键字实现,但在Hibernate中,由于ORM的特性,我们需要采用不同的方式来实现分页。Hibernate提供了一种称为`Criteria` API和`Query...

    hibernate分页(Eclipse项目)

    【标题】:Hibernate分页(Eclipse项目) 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作。本项目主要关注如何在使用Hibernate时实现分页功能,这对于处理大数据集的Web应用尤其...

    Hibernate分页库

    **二、Hibernate分页原理** Hibernate分页主要通过Criteria API或HQL(Hibernate Query Language)来实现。这两种方式都可以配合`org.hibernate.Query`或`org.hibernate.Criteria`对象的`setFirstResult()`和`...

    struts1+hibernate分页

    三、分页原理 分页是将大量数据分成多个小部分,每次只加载一部分数据到用户界面,以减少内存占用和提高页面响应速度。在Web应用中,通常需要提供页码或跳转链接让用户在不同页之间切换。分页的核心参数包括当前页、...

    Struts + Hibernate 实现简单分页功能

    首先,我们需要理解分页的基本原理。分页是为了提高用户体验,避免一次性加载大量数据导致页面加载慢或内存压力过大。在Web应用中,我们通常将数据分成多个页码,每次只请求和显示一部分数据,用户可以通过导航按钮...

    在JDBC,hibernate中实现分页

    ##### 分页原理 在SQL Server 2005中实现分页主要通过TOP子句和ROW_NUMBER()窗口函数。由于直接在SQL Server 2005中实现分页可能不如在应用层实现灵活,这里采用了一种称为“假分页”的方式,即先获取所有数据,再在...

    spring+struts2+hibernate整合实现分页

    4. **分页原理**:分页是为了解决大量数据一次性加载导致性能下降和用户体验不佳的问题。通常包括两个参数:当前页码和每页记录数。在SSH框架中,我们可以在Action中计算总页数,然后通过Hibernate的Criteria或HQL...

    Struts+Hibernate分页

    Struts和Hibernate是Java开发中两个非常重要的框架,它们分别负责Web层和持久化层的...同时,随着技术的发展,现在的Web应用更多地采用Spring MVC和MyBatis等现代框架,但基本的分页原理和处理方式仍可参考上述内容。

    高效率spring+struts+hibernate分页算法

    ### 高效率Spring+Struts+Hibernate分页算法解析 #### 一、引言 在Web应用程序开发过程中,为了提高用户体验以及系统性能,分页显示数据成为了一项必不可少的功能。本篇文章将详细介绍一种基于Spring、Struts和...

    Hibernate 分页

    一、Hibernate分页原理 Hibernate提供了一种基于SQL的分页查询方式,通过Query或Criteria API来实现。它通过设置两个关键参数,一个是页面大小(pageSize),即每页显示的数据量;另一个是页码(pageNumber),表示...

    基于hibernate_mysql分页通用源码

    【标题】"基于hibernate_mysql分页通用源码"涉及的关键知识点主要集中在Java Web开发领域,特别是关于ORM框架Hibernate、关系型数据库MySQL、MVC框架Struts2以及分页技术的应用。以下是对这些核心概念的详细解释: ...

    Hibernate分页

    #### Hibernate 分页机制原理 Hibernate 的分页机制主要通过 `Query` 对象的两个方法实现:`setFirstResult()` 和 `setMaxResults()`。这两个方法允许开发者指定从哪一条记录开始查询以及查询多少条记录,从而实现...

Global site tag (gtag.js) - Google Analytics