`
wind_bell
  • 浏览: 291362 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

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);

然后来看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();
  }

再来看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来实现分页,使用ResultSet的absolute方法直接移到查询起点,如果不支持的话,使用循环语句,rs.next一点点的移过去。

可见使用Hibernate,在进行查询分页的操作上,是具有非常大的灵活性,Hibernate会首先尝试用特定数据库的分页sql,如果没用,再尝试Scrollable,如果不行,最后采用rset.next()移动的办法。

  在查询分页代码中使用Hibernate的一大好处是,既兼顾了查询分页的性能,同时又保证了代码在不同的数据库之间的可移植性。



分享到:
评论
2 楼 chenxihua 2006-12-30  
有没有其他的分页思路呢
我觉得是否可以把主键缓存起来,
  select a.id  from t1 a, t2 b
  where a.f_id = b.id
   and b.start_date between .. and ..
   and  .....
t1.id是主键, 获得此结果集后,将id缓存起来(如存到List中)
分页查询时,移动分页窗口,生成新SQL
 
  select a.id, a.name, b.name......
  from t1 a, t2 b
  where a.id = ? and a.f_id = b.id
这样查询条件都只留下关联部分,而且是按主键查询,速度一定快
不知是否可行


1 楼 mickeybaobao 2006-09-30  
写的很好,很有帮助的

相关推荐

    hibernate分页查询

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

    Hibernate分页查询原理解读

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

    hibernate分页

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

    Hibernate分页库

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

    Hibernate 分页

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

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

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

    Hibernate 分页实现

    ### Hibernate分页原理 在Hibernate中,分页查询是通过Criteria API或HQL(Hibernate Query Language)来实现的,它们都支持添加限制条件以实现分页。分页主要涉及两个参数:`firstResult` 和 `maxResults`。`...

    J2EE Hibernate 分页

    一、Hibernate分页原理 Hibernate的分页查询是通过Query或Criteria接口提供的函数实现的。这些函数允许我们设置开始位置(firstResult)和最大记录数(maxResults),从而实现数据的分页。在SQL语句中,这相当于...

    基于hiberate的分页小例子

    一、Hibernate分页原理 Hibernate提供了一种灵活的查询方式——Criteria API和HQL(Hibernate Query Language),它们都支持分页查询。在这些查询中,我们可以通过设置`FirstResult`和`MaxResults`参数来实现分页。`...

    Hibernate通用分页.docx

    ### Hibernate 分页原理 1. **SQL 分页** - 在传统的SQL查询中,分页通常涉及到两个步骤: - 计算总数(countSql)以确定总页数。 - 执行分页查询(pagesql),通过LIMIT和OFFSET或类似机制获取特定页面的数据。...

    hibernate的分页

    一、Hibernate分页原理 Hibernate的分页查询基于SQL的LIMIT和OFFSET子句,通过设置查询参数来限制返回的结果数量和起始位置,从而实现数据的分页展示。在Hibernate中,我们可以使用Criteria、HQL(Hibernate Query ...

    hibernate实现分页

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

    hibernate分页(Eclipse项目)

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

    用Hibernate实现分页查询.docx

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

    struts1+hibernate分页

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

    java分页技术汇总

    ##### 4.1 Hibernate分页原理 Hibernate分页主要通过`Query`对象的方法实现。`Query.setFirstResult(int startPosition)`用于设置查询结果的起始位置,而`Query.setMaxResults(int maxResult)`用于设置查询结果的...

    在JDBC,hibernate中实现分页

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

    java分页原理详解

    Java 分页原理详解 Java 中的分页技术是指在查询大量数据时,为了提高性能和用户体验,将数据分成多页展示的技术。这种技术广泛应用于各种 Java 项目中,例如 Web 应用程序、移动应用程序等。 在 Java 中,常用的...

    Struts+Hibernate分页

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

Global site tag (gtag.js) - Google Analytics