Какой тип объекта возвращает метод выполнения Spring Hibernate Template для запроса подсчета в Oracle? - PullRequest
11 голосов
/ 17 августа 2010

При запуске с базой данных и базой данных Oracle, каков тип времени выполнения объекта, который следующий код Spring Hibernate Template (Spring 2.5 и Hibernate 3.3.2GA) возвращает, где SQL-запрос представляет собой запрос подсчета, например 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;

Этот код выдает следующее исключение:

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)

Ответы [ 4 ]

15 голосов
/ 18 августа 2010

Как насчет

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

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

9 голосов
/ 19 августа 2010

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

Ссылки:

0 голосов
/ 18 августа 2010

Тип класса объекта, который возвращает 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 голосов
/ 17 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...