What object type does Spring Hibernate Template execute method return for a counting query on Oracle?

When run against and Oracle database, what is the runtime type of the object that the following Spring Hibernate Template (Spring 2.5 and Hibernate 3.3.2GA) code returns where the SQL query is a counting query like select count(*) from table?

 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;

This code throws the following exception:

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)

11
задан Derek Mahar 19 August 2010 в 00:00
поделиться

4 ответа

Оказывается, 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();
    }
});

Ссылки:

9
ответ дан 3 December 2019 в 04:30
поделиться

Как насчет

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

Это будет работать для всех подклассов Number, таких как Long, Double, Biginteger или BigDecimal.

15
ответ дан 3 December 2019 в 04:30
поделиться

Я думаю, он возвращает тип Long. Я использовал Long в своем коде. Но если ваш BigDecimal работает, то даже я хочу знать, какой тип возвращаемого значения:)

0
ответ дан 3 December 2019 в 04:30
поделиться

Тип класса объекта, который возвращает hibernateTemplate.execute () , действительно является BigDecimal . Оказывается, причиной ClassCastException является приведение возвращаемого значения метода doInHibernate () :

(BigDecimal) query.uniqueResult();

Исправленный код:

 BigDecimal count = (BigDecimal) hibernateTemplate.execute(
   new HibernateCallback() { 
    public Object doInHibernate(Session session) throws HibernateException {
     SQLQuery query = session.createSQLQuery(sql);
     return query.uniqueResult();
    }});
 return count;
0
ответ дан 3 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: