在项目中用Hibernate的DetachedCriteria
离线查询时,遇到一个问题,就是不能获得DetachedCriteria
投影后的记录的总数。后来看了http://www.iteye.com/topic/14657中的文章,找到了解决办法。
HibernateTemplate还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。
HibernateTemplate的灵活访问方式是通过如下两个方法完成:
1, Object execute(HibernateCallback action)
2, List execute(HibernateCallback action)
,比如上面那个问题。
在没有投影的情况下,可以用来获得记录总数。
((Integer) getHibernateTemplate().findByCriteria(criteria .setProjection(Projections.rowCount())).get(0)).intValue();
但是如果带有投影的情况下,上面的方法就不行,就需要更灵活的方法,
public Integer getTotal( final DetachedCriteria detachedCriteria ) {
return (Integer) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
criteria.setProjection(null);
return totalCount;
}
}, true);
}
上面的方法需要一个HibernateCallback的实例,HibernateCallback实例可在任何有效的Hibernate数据访问中使用。程序开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决Spring封装Hibernate后灵活性不足的缺陷。HibernateCallback是一个接口,该接口只有一个方法doInHibernate(org.hibernate.Session session),该方法只有一个参数Session。
通常,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的实例,方法doInHibernate的方法体就是Spring执行的持久化操作。
注意:方法
doInHibernate
方法内可以访问
Session
,该
Session
对象是绑定到该线程的
Session
实例。该方法内的持久层操作,与不使用
Spring
时的持久层操作完全相同。这保证对于复杂的持久层访问,依然可以使用
Hibernate
的访问方式。
简单的说,使用回调(HibernateCallback
)可以得到session,但是用HebernateTemplate.getSession()同样可以得到;
两个是有区别的,HibernateCallback
回调封装了对异常和事务的处理。而直接获得HebernateTemplate.getSession(),你还有很多事要做。
-------------------------------------------------------分割线--------------------------------------------------------------------
如果第一次运行的时候没问题。
等你去拿第2页的时候,就提示说出现NullPointer。 发现是((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult())为Null, 也就是根本就拿不到表总数。
现在就需要先把 Projection 和 OrderBy 条件取出来,清空两者后,再来执行Count操作。最后再把原条件设置进去。
@SuppressWarnings("deprecation")
public Integer getTotal( final DetachedCriteria detachedCriteria ) {
return (Integer) getTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
//先把Projection和OrderBy条件取出来,清空两者来执行Count操作
CriteriaImpl impl = (CriteriaImpl) criteria;
Projection projection = impl.getProjection();
int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
//将之前的Projection和OrderBy条件重新设回去
criteria.setProjection(projection);
if (projection == null) {
criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
}
return totalCount;
}
}, true);
}
分享到:
相关推荐
HibernateCallback 使用方法 HibernateCallback 是 Hibernate 框架中的一种 callback 机制,允许开发者在持久层访问时执行自定义操作。HibernateCallback 是 Spring 框架中与 Hibernate 整合的重要组件,通过它可以...
在上面的代码中,我们使用 `HibernateCallback` 接口来执行原生 SQL 语句,该接口提供了一个 `doInHibernate()` 方法,该方法将在 Hibernate 事务中执行。我们可以在该方法中执行原生 SQL 语句,并使用 `Connection`...
在Java持久化框架Hibernate中,HibernateTemplate是一个便捷的工具类,它封装了常见的数据库操作,使得开发者能够更方便地与数据库交互。以下是对标题和描述中提到的HibernateTemplate方法的详细总结: A. `get` 和...
开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决了Spring封装Hibernate后灵活性不足的缺陷。 24.3 Spring对Hibernate的简化 24.3.4 HibernateTemplate的复杂用法 ...
随着Spring Data JPA的发展,越来越多的开发者转向使用Repository接口,它提供了更灵活且类型安全的查询方式。 总的来说,HibernateTemplate是Spring与Hibernate集成的重要工具,尤其适用于旧项目或对Hibernate有...
泛型Hibernate是利用Java泛型特性对Hibernate进行封装的一种方式,目的是为了提供更简洁、灵活且易于维护的数据库访问接口。 ##### 1.1 定义泛型接口IHibernateDao, PK> ```java /** * @author Administrator * ...
本文详细介绍了Spring与Hibernate集成的过程,包括如何配置`SessionFactory`、使用`HibernateTemplate`简化数据操作、通过`HibernateDaoSupport`提高代码可维护性以及利用`HibernateCallback`实现更复杂的业务逻辑。...
【Hibernate学习笔记,使用Hibernate做数据层非常方便】 在Java开发中,Hibernate是一个非常流行的ORM(Object-Relational Mapping)框架,它简化了数据库操作,将数据库中的表映射为Java对象,使得开发者可以像...
Spring通过提供一系列的DAO抽象类,如HibernateDaoSupport,HibernateTemplate以及HibernateCallBack,使得开发者可以更方便地实现DAO组件。这些抽象类作为DAO实现类的基类,降低了开发难度,确保了代码的一致性和可...
它通过回调机制(HibernateCallback)对Hibernate的操作进行封装,使开发者能够以一种更面向对象的方式处理数据库交互。例如,你可以通过实现HibernateCallback接口的doInHibernate方法,传入一个回调函数,执行特定...
在`MemberDaoImpl`实现类中,我们利用`HibernateTemplate`的`executeFind`方法,通过传入一个实现了`HibernateCallback`接口的匿名内部类来执行HQL查询,并设置分页参数。 2. `getAllRowCount`:此方法用于获取满足...
`queryForPage` 方法通过`getHibernateTemplate().executeFind()`方法执行HQL查询,并利用`HibernateCallback`接口回调来设置查询的起始位置和最大结果数,从而实现分页。`getAllRowCount` 方法则直接返回HQL查询后...
### Hibernate与Spring集成分页方法详解 在Java企业级应用开发中,经常需要处理大量数据的展示和查询问题。为了提高用户体验并优化服务器资源利用,分页查询是一种非常实用的技术手段。本文将详细介绍如何在...
总的来说,Hibernate API提供了丰富的功能来处理数据库操作,`HibernateTemplate`为Spring应用程序提供了方便的抽象,而直接使用`Session`则提供了更多的灵活性。选择哪种方式取决于具体项目的需求和团队的偏好。在...
此外,`HibernateTemplate`还支持`HibernateCallback`接口,允许开发者在回调方法`doInHibernate(Session session)`中使用原生的Hibernate API,以应对更复杂的数据访问需求。这种方法确保了灵活性,即使在Spring的...
3. **模板方法模式**:Spring 为 Hibernate 提供了三种主要的支持方式:`HibernateDaoSupport`、`HibernateTemplate` 和 `HibernateCallback` 接口。其中,`HibernateTemplate` 是一个非常实用的工具类,它可以简化 ...
### Struts+Spring+Hibernate通用分页方法详解 #### 一、引言 在Web应用开发中,分页是一项常用且重要的功能。特别是在处理大量数据时,合理的分页策略能够显著提升用户体验并减轻服务器压力。Struts+Spring+...
### 使用Hibernate与Spring实现分页功能 #### 一、引言 在开发Web应用程序时,分页是一项常用的功能。它可以显著提升用户体验,并减轻服务器压力。本文将详细介绍如何结合使用Hibernate和Spring框架来实现数据的...
在Hibernate中,实现分页主要通过`setMaxResults()`和`setFirstResult()`这两个方法。其中: - `setMaxResults(int maxResult)`:设置每页显示的数据量。 - `setFirstResult(int index)`:设置从哪条记录开始查询。...
- `UserDaoImpl`: 实现了`UserDao`接口,利用Spring的`HibernateDaoSupport`简化了与Hibernate的交互,通过`HibernateCallback`执行查询操作。 - `index.jsp`: 用户输入界面,可能包含一个表单,提交用户ID。 - `...