Java 对于Oracle上的计数查询,Spring Hibernate模板执行方法返回的对象类型是什么?
当针对和Oracle数据库运行时,以下代码(Spring 2.5和Hibernate 3.3.2GA)返回的对象的运行时类型是什么,其中SQL查询是计数查询,如表中的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
选择计数(*)
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();
}
});
参考资料:
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();
}
});