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

相关推荐