`
wang4674890
  • 浏览: 87534 次
  • 性别: Icon_minigender_2
  • 来自: 厦门
社区版块
存档分类
最新评论

Hibernate 更灵活的用法 HibernateCallback

 
阅读更多

在项目中用Hibernate的DetachedCriteria 离线查询时,遇到一个问题,就是不能获得DetachedCriteria 投影后的记录的总数。后来看了http://www.iteye.com/topic/14657中的文章,找到了解决办法。

 

HibernateTemplate还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。
HibernateTemplate的灵活访问方式是通过如下两个方法完成:
1,   Object execute(HibernateCallback action)
2,   List execute(HibernateCallback action)
,比如上面那个问题。
在没有投影的情况下,可以用来获得记录总数。

1.((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使用方法

    Hibernate3.6.10用到的jiar

    Hibernate3.6.10用到的jiar antlr-2.7.6.jar,commons-collections-3.1, commons-logging-1.1.3, dom4j-1.6.1, ejb3-persistence, hibernate-jpa-2.0-api-1.0.1.Final, hibernate3, javassist-3.12.0.GA, jta...

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

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

    Spring整合Hibernate 详解.doc

    6.5 Spring整合Hibernate 6.6 Spring提供的DAO支持 6.5.2 管理Hibernate的...6.5.4 使用HibernateCallBack 6.5.6 使用IoC容器组装各种组件 6.5.7启动web容器读取xml配置文件 6.5.8了解继承自HibernateDaoSupport类DAO

    ssh(structs,spring,hibernate)框架中的上传下载

    HibernateDaoSupport封装了HibernateTemplate,而HibernateTemplate封装了Hibernate所提供几乎所有的的数据操作方法,如execute(HibernateCallback action),load(Class entityClass, Serializable id),save(final ...

    spring_MVC源码

    弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,...

    HibernateTemplate详细描述以及使用范围

    对Spring框架中,HibernateTemplate的使用,底层dao中HibernateTemplate的使用以及HibernateCallBack调用等等

    新闻发布系统

    return template.execute(new HibernateCallback<List<News>>() { public List<News> doInHibernate(Session session) throws HibernateException,SQLException { List<News> list = null; Query query...

    SPRING API 2.0.CHM

    HibernateInterceptor HibernateInterceptor HibernateJdbcException HibernateJdbcException HibernateJpaDialect HibernateJpaVendorAdapter HibernateObjectRetrievalFailureException ...

Global site tag (gtag.js) - Google Analytics