`
fei_6666
  • 浏览: 207606 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate 分页查询及记录数量查询

阅读更多
hibernate 获得记录集的数量
1---sql

String sql="select count(*) as count from ACCOUNT AS a "

Integer count=(Integer) getSession().createSQLQuery(sql).addScalar("count", Hibernate.INTEGER)
.uniqueResult();

也可以通过LIST对象获得 这里就不在叙述了

2---hql

String hql="select count(*) as count from Account as a";

Query query=getSession().createQuery(hql);

int count=((Number)query.iterate().next()).intValue();



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  }

  如果支持scrollable result,使用ResultSet的absolute方法直接移到查询起点,如果不支持的话,使用循环语句,rs.next一点点的移过去。

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

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

相关推荐

    hibernate分页查询 数据库连接

    此外,优化查询,避免N+1查询问题,合理设计实体关系,都能有效提升Hibernate分页查询的效率。 总结起来,Hibernate的分页查询和数据库连接管理是其强大功能的重要组成部分。正确理解和使用这些特性,能够帮助...

    Struts和Hibernate分页及查询

    总结起来,"Struts+Hibernate分页及查询"项目展示了如何利用这两种框架进行数据交互和展示,是学习和掌握Java Web开发的重要实践。通过这个项目,开发者可以深入理解MVC模式和ORM理念,提升在复杂业务场景下的开发...

    hibernate分页查询功能

    本示例中,我们看到如何利用Struts2、Spring和Hibernate这三个流行框架来实现分页查询功能。下面我们将详细讲解这个实现过程。 1. **UserDao接口**: UserDao接口定义了分页查询的方法,通过`getUser(int offset, ...

    hibernate实现分页查询

    分页查询的核心思想是通过限制SQL查询结果的数量来实现分页效果。通常,我们需要确定两个关键参数:当前页数(`thisNumber`)和每页显示的记录数(`sumCount`)。基于这两个参数,我们可以计算出查询时应从哪一条...

    用Hibernate实现分页查询.docx

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

    hibernate分页Hibernate 分页的设计和编码

    Hibernate分页功能的设计与编码涉及多个方面,包括参数处理、数据库查询优化、前端显示逻辑等。正确实施分页不仅可以提升用户体验,还能显著提高应用程序的性能和响应速度,特别是在处理大数据量的情况下。理解并...

    struts2+spring+hibernate分页显示完整代码

    在`MemberDao`接口中,我们定义了两个关键的方法,一个是用于分页查询,另一个是获取所有记录的数量。这两个方法分别如下: 1. `queryForPage` 方法接受三个参数:HQL(Hibernate Query Language)查询语句、开始...

    Struts + Hibernate 分页实现

    这通常涉及到设置查询条件、限制查询结果的数量(如每页多少条记录)以及指定查询的起始位置(当前页的第一条记录在所有记录中的位置)。例如,使用Criteria API,我们可以设置`setFirstResult()`和`setMaxResults()...

    hibernate的分页查询

    首先,我们可以通过Hibernate的`Query`对象设置分页参数,例如`setFirstResult`指定查询的起始位置,`setMaxResults`限制返回结果的数量。在给出的示例代码中: ```java Query q = session.createQuery("from Cat ...

    struts+hibernate分页 模糊查询

    分页查询是指将查询结果按照一定的数量进行分段显示的技术。下面我们将介绍如何使用Struts和Hibernate实现分页查询。 ##### 3.1 实现步骤 1. **配置Hibernate**: - 创建`hibernate.cfg.xml`配置文件,设置数据库...

    spring+hibernate 分页 +mysql

    在分页查询中,MySQL提供了LIMIT和OFFSET关键字,用于从结果集中选择特定数量的行,实现数据的分页显示。 实现Spring+Hibernate+MySQL的分页功能通常涉及以下几个步骤: 1. **配置Hibernate**: 首先,我们需要在...

    Hibernate各种查询:联表查询 分页查询 位置参数查询(?) 占位符查询(冒号查询) 统计查询

    本篇文章将详细解析Hibernate中的几种主要查询方式,包括联表查询、分页查询、位置参数查询、占位符查询(冒号查询)以及统计查询,这些都是在实际开发中非常常见的需求。 首先,我们来看**联表查询**。在Hibernate...

    用户Hibernate实现的一个分页

    一、Hibernate分页基础 1. Hibernate的Query和Criteria API都提供了分页功能。使用`setFirstResult()`方法设置查询开始的位置,即第几条记录,以及`setMaxResults()`方法设置一次返回的最大记录数,这两者结合即可...

    Hibernate分页封装

    setFirstResult()方法用于设置查询的起始记录,而setMaxResults()方法用于设置查询的记录数量。 4. 分页算法 在上面的示例代码中,我们还可以看到,分页算法主要通过countSize()和countPage()方法来实现。count...

    springMVC+hibernate的条件查询加分页的demo

    Service层根据这些参数计算出起始记录位置和记录数量,然后在执行查询时应用这些设置。 此外,为了方便前端展示,Service层通常会返回一个包含查询结果和分页信息的对象,如Page对象,这个对象不仅包含查询结果列表...

    用Struts+Hibernate做的分页

    然后,在Action中调用这个Service方法,传入当前页码和每页显示的数量,Service返回分页后的数据集合以及总记录数。Action再将这些信息封装成一个模型类(可能是一个Pojo或ActionForm),并将其传递给视图层。 视...

    struts+hibernate分页

    综上所述,"struts+hibernate分页"涉及到的主要是如何在Struts的控制层和Hibernate的数据层之间协调处理分页请求,以及在DAO层利用Hibernate的特性实现数据库查询的分页。理解并掌握这两个框架的分页机制,对于开发...

    hibernate分页技术.doc

    hibernate分页技术是数据库操作中的重要一环,它能有效地提高数据查询效率,减少不必要的数据传输,优化用户体验。在使用Hibernate这个流行的Java ORM框架时,我们可以利用其内置的功能来实现分页查询。 首先,我们...

Global site tag (gtag.js) - Google Analytics