代码之家  ›  专栏  ›  技术社区  ›  Derek Mahar

springhibernate模板execute方法为Oracle上的计数查询返回什么对象类型?

  •  11
  • Derek Mahar  · 技术社区  · 15 年前

    Spring Hibernate Template (Spring2.5和Hibernate3.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 年前
        1
  •  15
  •   Jörn Horstmann    15 年前

    怎么样

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

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

        2
  •  9
  •   Derek Mahar    15 年前

    结果发现 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();
        }
    });
    

    参考文献:

        3
  •  0
  •   Ankit Bansal    15 年前

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

        4
  •  0
  •   Derek Mahar    15 年前

    对象的类类型 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;