论坛首页 Java企业应用论坛

hibernate升级到3.2带来的count、sum等查询的兼容性问题

浏览 3760 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-13  

     今天调试程序,以前好好的hibernate查询,突然开始报ClassCastException,出现的语句都是出现在count查询数据条数的hql语句处,说类型为java.lang.Long。奇怪了啊,以前好好地啊。

上网一查,原来是hibernate从3.1升到3.2带来的兼容性问题。

具体说明:

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

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

 

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

Configuration classicCfg = new Configuration();
classicCfg.addSqlFunction( "count", new ClassicCountFunction());
classicCfg.addSqlFunction( "avg", new ClassicAvgFunction());
classicCfg.addSqlFunction( "sum", new ClassicSumFunction());
SessionFactory classicSf = classicCfg.buildSessionFactory();

int count = ((Integer)q.uniqueResult()).intValue();

改成 int count = ((Number)q.uniqueResult()).intValue(); 这样就可以两个版本同时兼容.

 

   发表时间:2008-11-13  
nt count = ((Number)q.uniqueResult()).intValue();
我都整这个用 新写得都统一long
0 请登录后投票
   发表时间:2008-11-14  
laiseeme 写道

nt count = ((Number)q.uniqueResult()).intValue(); 我都整这个用 新写得都统一long

是啊,一开始确定使用hibernate3.2以上版本的时候,最好都统一这么写,就不会出现问题。
但是有好多系统是升级过来的,所以对以前的程序可以采用上面说的第一种方式来达到兼容的目的。
0 请登录后投票
   发表时间:2008-11-14  
哈哈,谢谢楼主啦!我经常遇到这个问题,今天看了楼主的贴,真是收益匪浅啦!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics