当前位置: 首页 > 面试题库 >

对于Oracle上的计数查询,Spring Hibernate Template执行方法返回哪种对象类型?

翟淇
2023-03-14
问题内容

当针对Oracle数据库运行时,以下Spring
Hibernate模板
(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)

问题答案:

原来,这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();
    }
});

参考文献:

  • 带有SQLQuery和setCacheable(Class)的ClassCastException
  • Martin Schaaf的博客:具有SQLQuery和setCacheable(true)的ClassCastException
  • 使用Hibernate和EhCache缓存原始SQL计数
  • HHH-5163在基于可缓存投影的条件上应用ResultTransformer时遇到的错误
  • Hibernate尝试使用ResultTransformer缓存结果时发生ClassCastException


 类似资料:
  • 我需要将json对象从匿名函数加载到变量实例。 本例中的实例未定义。 我敢肯定,解决方法很简单,但是新手在节点上找不到答案…:(

  • 问题内容: Oracle JDBC驱动程序将哪些Java数据类型分配给Oracle SQL数据类型?这是否随类型的大小而变化? 问题答案: 正如其他人已经说过的:驱动程序将所有内容都映射到BigDecimal,即使将其定义为NUMBER(38)(可以将其映射到BigInteger)也是如此。 但是找出驱动程序映射很容易。只需在ResultSet的列上执行getObject(),然后查看驱动程序生成

  • 问题内容: 我有一个Oracle表,其中包含一组范围(RangeA和RangeB)。这些列是varchar,因为它们可以同时容纳数字和字母数字值,如以下示例所示: 我需要执行一个查询,该查询仅返回具有数值的记录,并对该查询执行Count。到目前为止,我已经尝试过使用两个不同的查询来做到这一点,但没有任何运气: 查询1: 查询2: 子查询工作正常,因为我得到的两个记录都只有数字值,但是查询的COUN

  • 问题内容: 从子类对象调用该方法时,是否有任何优雅的方法可以使位于父类中的Java方法返回子类的对象? 我想在不使用其他接口和方法的情况下实现此功能,并在没有类强制转换,辅助参数等的情况下使用此功能。 更新: 抱歉,我不太清楚。 我想实现方法链,但是父类的方法存在问题:调用父类方法时,我无法访问子类方法… 我想我已经提出了我的想法的核心。 因此,方法应返回类的对象。 问题答案: 如果您只是在寻找针

  • 问题内容: 可能是之前问过的一个问题,但是像往常一样,第二个提到“通用”一词时,您会得到一千个答案,以解释类型擦除。我很早以前就经历了这一阶段,现在对泛型及其使用有了很多了解,但是这种情况稍微有些微妙。 我有一个表示电子表格中数据单元格的容器,该容器实际上以两种格式存储数据:既作为显示字符串,也取决于数据(作为对象存储)为另一种格式。该单元格还包含一个在类型之间转换的转换器,并且还对类型进行有效性

  • 我正在将一个旧的java Spring项目重构为springboot,并以传统的war风格部署它。出于某种原因,我必须坚持传统的web.xml来启动应用程序。多亏了Springboot遗产,我可以通过web.xml实现这一点: 此外,我添加了springboot执行器依赖项。应用程序。属性如下所示: 应用程序可以正常启动,但当我尝试从浏览器访问endpoint时,它只返回一个“401需要完全身份验