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
分享到:
相关推荐
此外,优化查询,避免N+1查询问题,合理设计实体关系,都能有效提升Hibernate分页查询的效率。 总结起来,Hibernate的分页查询和数据库连接管理是其强大功能的重要组成部分。正确理解和使用这些特性,能够帮助...
总结起来,"Struts+Hibernate分页及查询"项目展示了如何利用这两种框架进行数据交互和展示,是学习和掌握Java Web开发的重要实践。通过这个项目,开发者可以深入理解MVC模式和ORM理念,提升在复杂业务场景下的开发...
本示例中,我们看到如何利用Struts2、Spring和Hibernate这三个流行框架来实现分页查询功能。下面我们将详细讲解这个实现过程。 1. **UserDao接口**: UserDao接口定义了分页查询的方法,通过`getUser(int offset, ...
分页查询的核心思想是通过限制SQL查询结果的数量来实现分页效果。通常,我们需要确定两个关键参数:当前页数(`thisNumber`)和每页显示的记录数(`sumCount`)。基于这两个参数,我们可以计算出查询时应从哪一条...
#### 一、分页查询概念及原理 分页查询是一种在数据量较大的情况下,为了提高用户体验和系统性能而采取的一种技术手段。它将查询结果分成若干页显示,用户可以通过翻页操作查看不同的数据集。 在进行分页查询时,...
Hibernate分页功能的设计与编码涉及多个方面,包括参数处理、数据库查询优化、前端显示逻辑等。正确实施分页不仅可以提升用户体验,还能显著提高应用程序的性能和响应速度,特别是在处理大数据量的情况下。理解并...
在`MemberDao`接口中,我们定义了两个关键的方法,一个是用于分页查询,另一个是获取所有记录的数量。这两个方法分别如下: 1. `queryForPage` 方法接受三个参数:HQL(Hibernate Query Language)查询语句、开始...
这通常涉及到设置查询条件、限制查询结果的数量(如每页多少条记录)以及指定查询的起始位置(当前页的第一条记录在所有记录中的位置)。例如,使用Criteria API,我们可以设置`setFirstResult()`和`setMaxResults()...
首先,我们可以通过Hibernate的`Query`对象设置分页参数,例如`setFirstResult`指定查询的起始位置,`setMaxResults`限制返回结果的数量。在给出的示例代码中: ```java Query q = session.createQuery("from Cat ...
分页查询是指将查询结果按照一定的数量进行分段显示的技术。下面我们将介绍如何使用Struts和Hibernate实现分页查询。 ##### 3.1 实现步骤 1. **配置Hibernate**: - 创建`hibernate.cfg.xml`配置文件,设置数据库...
在分页查询中,MySQL提供了LIMIT和OFFSET关键字,用于从结果集中选择特定数量的行,实现数据的分页显示。 实现Spring+Hibernate+MySQL的分页功能通常涉及以下几个步骤: 1. **配置Hibernate**: 首先,我们需要在...
本篇文章将详细解析Hibernate中的几种主要查询方式,包括联表查询、分页查询、位置参数查询、占位符查询(冒号查询)以及统计查询,这些都是在实际开发中非常常见的需求。 首先,我们来看**联表查询**。在Hibernate...
一、Hibernate分页基础 1. Hibernate的Query和Criteria API都提供了分页功能。使用`setFirstResult()`方法设置查询开始的位置,即第几条记录,以及`setMaxResults()`方法设置一次返回的最大记录数,这两者结合即可...
setFirstResult()方法用于设置查询的起始记录,而setMaxResults()方法用于设置查询的记录数量。 4. 分页算法 在上面的示例代码中,我们还可以看到,分页算法主要通过countSize()和countPage()方法来实现。count...
Service层根据这些参数计算出起始记录位置和记录数量,然后在执行查询时应用这些设置。 此外,为了方便前端展示,Service层通常会返回一个包含查询结果和分页信息的对象,如Page对象,这个对象不仅包含查询结果列表...
然后,在Action中调用这个Service方法,传入当前页码和每页显示的数量,Service返回分页后的数据集合以及总记录数。Action再将这些信息封装成一个模型类(可能是一个Pojo或ActionForm),并将其传递给视图层。 视...
综上所述,"struts+hibernate分页"涉及到的主要是如何在Struts的控制层和Hibernate的数据层之间协调处理分页请求,以及在DAO层利用Hibernate的特性实现数据库查询的分页。理解并掌握这两个框架的分页机制,对于开发...
hibernate分页技术是数据库操作中的重要一环,它能有效地提高数据查询效率,减少不必要的数据传输,优化用户体验。在使用Hibernate这个流行的Java ORM框架时,我们可以利用其内置的功能来实现分页查询。 首先,我们...