Hibernate使用count(*)取得表中记录总数 – 风之音 – ITeye技术网站

来源: Hibernate使用count(*)取得表中记录总数 – 风之音 – ITeye技术网站

Java代码  收藏代码
  1. /**
  2.   * @TODO:查询某一年度的所有计划数量
  3.   */
  4. public int findCountByYear(String currYear) {
  5.     String hqlString = “select count(*) from WaterPlan as p where p.planYear ='”+currYear+“‘”;
  6.     Query query = this.getSession().createQuery(hqlString);
  7.     return ((Number)query.uniqueResult()).uniqueResult();
  8. }

从Hibernate 3.0.x/3.1.x升级到最新的3.2版之后,3.2版的很多SQL函数如count(), sum()的唯一返回值已经从Integer变为Long,如果不升级代码,会得到一个ClassCastException。

这个变化主要是为了兼容JPA,可以在hibernate.org的最新文档中找到说明。

Hibernate Team也提供了一个与原来兼容的解决方案:

Java代码  收藏代码
  1. Configuration classicCfg = new Configuration();
  2. classicCfg.addSQLFunction( “count”new ClassicCountFunction());
  3. classicCfg.addSQLFunction( “avg”new ClassicAvgFunction());
  4. classicCfg.addSqlFunction( “sum”new ClassicSumFunction());
  5. SessionFactory classicSf = classicCfg.buildSessionFactory();

Java代码  收藏代码
  1. //int count = ((Integer)query.uniqueResult()).intValue(); 
  2. //改成 
  3. int count = ((Number)query.uniqueResult()).intValue();
  4. //这样就可以两个版本同时兼容. 

 

Java代码  收藏代码
  1. //参考代码
  2. //第一种方法:
  3.   String hql = “select count(*) from User as user”;
  4.   Integer count = (Integer)getHibernateTemplate().find(hql).listIterator().next();
  5.   return count.intValue();
  6. //第二种方法:
  7.  String hql = “select count(*) from User as user”;
  8.   return ((Integer)getHibernateTemplate().iterate(hql).next()).intValue();
  9. //第三种方法:
  10.  String hql = “select count(*) from User as user”;
  11.  Query query =  getHibernateTemplate().createQuery( getSession(),hql);
  12.  return ((Integer)query.uniqueResult()).intValue();
分享到: 更多 (0)