Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对于Oracle上的计数查询,Spring Hibernate模板执行方法返回的对象类型是什么?_Java_Oracle_Hibernate_Spring_Types - Fatal编程技术网

Java 对于Oracle上的计数查询,Spring Hibernate模板执行方法返回的对象类型是什么?

Java 对于Oracle上的计数查询,Spring Hibernate模板执行方法返回的对象类型是什么?,java,oracle,hibernate,spring,types,Java,Oracle,Hibernate,Spring,Types,当针对和Oracle数据库运行时,以下代码(Spring 2.5和Hibernate 3.3.2GA)返回的对象的运行时类型是什么,其中SQL查询是计数查询,如表中的选择计数(*) String sql = "select count(*) from table"; BigDecimal count = (BigDecimal) hibernateTemplate.execute( new HibernateCallback() { public Object doInHib

当针对和Oracle数据库运行时,以下代码(Spring 2.5和Hibernate 3.3.2GA)返回的对象的运行时类型是什么,其中SQL查询是计数查询,如表中的
选择计数(*)

 String sql = "select count(*) from table";
 BigDecimal count = (BigDecimal) hibernateTemplate.execute(
   new HibernateCallback() { 
    public Object doInHibernate(Session session) throws HibernateException {
     SQLQuery query = session.createSQLQuery(sql);
     return (BigDecimal) query.uniqueResult();
    }});
 return count;
此代码引发以下异常:

javax.ejb.EJBException: EJB Exception: : java.lang.ClassCastException: java.math.BigDecimal cannot be cast to [Ljava.lang.Object;
    at org.hibernate.cache.StandardQueryCache.put(StandardQueryCache.java:83)
    at org.hibernate.loader.Loader.putResultInQueryCache(Loader.java:2185)
    at org.hibernate.loader.Loader.listUsingQueryCache(Loader.java:2129)
    at org.hibernate.loader.Loader.list(Loader.java:2087)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
    at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
    at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:150)
    at org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:804)
    at com.db.abstrack.dao.hibernate.RfqCdoUsDaoHibernate$1.doInHibernate(RfqCdoUsDaoHibernate.java:124)

我认为它返回的是Long类型。我在代码中使用了很长时间。但是如果你的BigDecimal有效,那么我想知道什么是返回类型:)

怎么样

long value = ((Number)query.uniqueResult()).longValue();
return Long.valueOf(value);

这适用于数字的所有子类,如Long、Double、Biginteger或BigDecimal。

hibernateTemplate.execute()返回的对象的类类型确实是
BigDecimal
。结果表明,
ClassCastException
的原因是方法
doInHibernate()
的返回值的强制转换:

更正代码:

 BigDecimal count = (BigDecimal) hibernateTemplate.execute(
   new HibernateCallback() { 
    public Object doInHibernate(Session session) throws HibernateException {
     SQLQuery query = session.createSQLQuery(sql);
     return query.uniqueResult();
    }});
 return count;

结果表明,
ClassCastException
可能是由于Hibernate标准查询缓存中的错误造成的

解决方案是向查询中添加标量:

String sql = "select count(*) as result from table";
BigDecimal count = (BigDecimal) ht.execute(new HibernateCallback() {
    public Object doInHibernate(Session session)
            throws HibernateException {
        SQLQuery query = session.createSQLQuery(sql);
        // Add scalar to avoid bug in Hibernate query cache.
        query.addScalar("result", Hibernate.BIG_DECIMAL);
        return query.uniqueResult();
    }
});
参考资料:


Erm,运行代码?如果没有ClassCastException,则它是一个BigDecimal,否则该异常将告诉您它是什么类型。(HibernateTemplate.execute返回由提供的HibernateCallback返回的对象,您将其转换为BigDecimal)。您使用的是什么版本的hibernate库?它以前返回一个整数,但现在应该是一个长问题。更新后的问题显示Hibernate 3.3.2GA。这并没有解决问题。显然,Hibernate查询缓存中可能有一个bug。谢谢你发布这篇文章(还有+1)。谢谢你的指点。不幸的是,我无法使用您的解决方案,因为我的条件查询使用
ResultTransformer
返回一个实体(而不仅仅是一个标量)。根据HHH-5163错误描述,在Hibernate 4.0.0发布后,应修复此问题
String sql = "select count(*) as result from table";
BigDecimal count = (BigDecimal) ht.execute(new HibernateCallback() {
    public Object doInHibernate(Session session)
            throws HibernateException {
        SQLQuery query = session.createSQLQuery(sql);
        // Add scalar to avoid bug in Hibernate query cache.
        query.addScalar("result", Hibernate.BIG_DECIMAL);
        return query.uniqueResult();
    }
});