hibernate不同版本 count() 返回类型不一样
希望大家使用Hibernate比较熟悉的人,确认一下,大家随意使用count(*)然后读取看看,到底是Integer,还是Long
---------
关于在Hibernate里使用selectcount(*)返回值的问题说明
由于我使用的是Hibernate3.2版本,经确认,这个版本已经把以前返回Integer的改成了Long,
因为JPA里面的返回值规定是Long,Hibernate为了兼容这个,所以修改了返回值。
如果你从Hibernate3.0.x/3.1.x升级到最新的3.2版,一定要注意,3.2版的很多sql函数如count(),sum()的唯一返回值已经从Integer变为Long,如果不升级代码,会得到一个ClassCastException。
这个变化主要是为了兼容JPA,可以在hibernate.org的最新文档中找到说明。
HibernateTeam也提供了一个与原来兼容的解决方案:
ConfigurationclassicCfg=newConfiguration();
classicCfg.addSqlFunction("count",newClassicCountFunction());
classicCfg.addSqlFunction("avg",newClassicAvgFunction());
classicCfg.addSqlFunction("sum",newClassicSumFunction());
SessionFactoryclassicSf=classicCfg.buildSessionFactory();
-----推荐的解决
Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Number number=((Number) session.createQuery( "select count(*) from Post where idParent=0").iterate().next()); return number.intValue();
因为无论是Long还是Integer,还是BigInteger,它们都是Number的子类,所以用Number去cast这个结果是肯定不会错的,然后,最好定义在Number里面这些方法可以统一的返回需要的类型;
bytebyteValue()
以byte形式返回指定的数值。
abstractdoubledoubleValue()
以double形式返回指定的数值。
abstractfloatfloatValue()
以float形式返回指定的数值。
abstractintintValue()
以int形式返回指定的数值。
abstractlonglongValue()
以long形式返回指定的数值。
shortshortValue()
以short形式返回指定的数值。
=====================================================
java.lang
类Number
java.lang.Object
java.lang.Number
所有已实现的接口:
Serializable
直接已知子类:
AtomicInteger,AtomicLong,BigDecimal,BigInteger,Byte,Double,Float,Integer,Long,Short