`

Hibernate 更灵活的用法 HibernateCallback

阅读更多

在项目中用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 使用方法 HibernateCallback 是 Hibernate 框架中的一种 callback 机制,允许开发者在持久层访问时执行自定义操作。HibernateCallback 是 Spring 框架中与 Hibernate 整合的重要组件,通过它可以...

    hibernate执行原生sql语句

    在上面的代码中,我们使用 `HibernateCallback` 接口来执行原生 SQL 语句,该接口提供了一个 `doInHibernate()` 方法,该方法将在 Hibernate 事务中执行。我们可以在该方法中执行原生 SQL 语句,并使用 `Connection`...

    Hibernate方法总结

    在Java持久化框架Hibernate中,HibernateTemplate是一个便捷的工具类,它封装了常见的数据库操作,使得开发者能够更方便地与数据库交互。以下是对标题和描述中提到的HibernateTemplate方法的详细总结: A. `get` 和...

    第24次课-1 Spring与Hibernate的整合

    开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决了Spring封装Hibernate后灵活性不足的缺陷。 24.3 Spring对Hibernate的简化 24.3.4 HibernateTemplate的复杂用法 ...

    对hibernate的封装 HibernateTemplate

    随着Spring Data JPA的发展,越来越多的开发者转向使用Repository接口,它提供了更灵活且类型安全的查询方式。 总的来说,HibernateTemplate是Spring与Hibernate集成的重要工具,尤其适用于旧项目或对Hibernate有...

    Spring/泛型Hibernate的实现

    泛型Hibernate是利用Java泛型特性对Hibernate进行封装的一种方式,目的是为了提供更简洁、灵活且易于维护的数据库访问接口。 ##### 1.1 定义泛型接口IHibernateDao, PK> ```java /** * @author Administrator * ...

    spring+hibernate详解

    本文详细介绍了Spring与Hibernate集成的过程,包括如何配置`SessionFactory`、使用`HibernateTemplate`简化数据操作、通过`HibernateDaoSupport`提高代码可维护性以及利用`HibernateCallback`实现更复杂的业务逻辑。...

    Hibernate学习笔记,使用Hibernate做数据层非常方便

    【Hibernate学习笔记,使用Hibernate做数据层非常方便】 在Java开发中,Hibernate是一个非常流行的ORM(Object-Relational Mapping)框架,它简化了数据库操作,将数据库中的表映射为Java对象,使得开发者可以像...

    Spring整合Hibernate 详解.doc

    Spring通过提供一系列的DAO抽象类,如HibernateDaoSupport,HibernateTemplate以及HibernateCallBack,使得开发者可以更方便地实现DAO组件。这些抽象类作为DAO实现类的基类,降低了开发难度,确保了代码的一致性和可...

    Spring整合hibernate

    它通过回调机制(HibernateCallback)对Hibernate的操作进行封装,使开发者能够以一种更面向对象的方式处理数据库交互。例如,你可以通过实现HibernateCallback接口的doInHibernate方法,传入一个回调函数,执行特定...

    Struts2,hibernate,Spring分页方法

    在`MemberDaoImpl`实现类中,我们利用`HibernateTemplate`的`executeFind`方法,通过传入一个实现了`HibernateCallback`接口的匿名内部类来执行HQL查询,并设置分页参数。 2. `getAllRowCount`:此方法用于获取满足...

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

    `queryForPage` 方法通过`getHibernateTemplate().executeFind()`方法执行HQL查询,并利用`HibernateCallback`接口回调来设置查询的起始位置和最大结果数,从而实现分页。`getAllRowCount` 方法则直接返回HQL查询后...

    Hibernate和Spring集成分页方法

    ### Hibernate与Spring集成分页方法详解 在Java企业级应用开发中,经常需要处理大量数据的展示和查询问题。为了提高用户体验并优化服务器资源利用,分页查询是一种非常实用的技术手段。本文将详细介绍如何在...

    hibernate API

    总的来说,Hibernate API提供了丰富的功能来处理数据库操作,`HibernateTemplate`为Spring应用程序提供了方便的抽象,而直接使用`Session`则提供了更多的灵活性。选择哪种方式取决于具体项目的需求和团队的偏好。在...

    HibernateS整合pring

    此外,`HibernateTemplate`还支持`HibernateCallback`接口,允许开发者在回调方法`doInHibernate(Session session)`中使用原生的Hibernate API,以应对更复杂的数据访问需求。这种方法确保了灵活性,即使在Spring的...

    spring整合hibernate

    3. **模板方法模式**:Spring 为 Hibernate 提供了三种主要的支持方式:`HibernateDaoSupport`、`HibernateTemplate` 和 `HibernateCallback` 接口。其中,`HibernateTemplate` 是一个非常实用的工具类,它可以简化 ...

    struts+spring+hibernate通用分页方法

    ### Struts+Spring+Hibernate通用分页方法详解 #### 一、引言 在Web应用开发中,分页是一项常用且重要的功能。特别是在处理大量数据时,合理的分页策略能够显著提升用户体验并减轻服务器压力。Struts+Spring+...

    hibernate+spring实现分页

    ### 使用Hibernate与Spring实现分页功能 #### 一、引言 在开发Web应用程序时,分页是一项常用的功能。它可以显著提升用户体验,并减轻服务器压力。本文将详细介绍如何结合使用Hibernate和Spring框架来实现数据的...

    基于hibernate实现的分页技术

    在Hibernate中,实现分页主要通过`setMaxResults()`和`setFirstResult()`这两个方法。其中: - `setMaxResults(int maxResult)`:设置每页显示的数据量。 - `setFirstResult(int index)`:设置从哪条记录开始查询。...

    MyEclipse的整合Struts+Spring+Hibernate简单例子开发

    - `UserDaoImpl`: 实现了`UserDao`接口,利用Spring的`HibernateDaoSupport`简化了与Hibernate的交互,通过`HibernateCallback`执行查询操作。 - `index.jsp`: 用户输入界面,可能包含一个表单,提交用户ID。 - `...

Global site tag (gtag.js) - Google Analytics