期望类型为:java.lang.Double,实际值为:java.lang.Integer,Hibernate 错误。

4

我使用createSqlQuery接口在hibernate中调用存储过程,并使用结果转换器将结果作为bean获取。以下是我的代码:

Query query=sessionfactory.getCurrentSession().createSQLQuery("exec usp_ListUsersNotSubmitTimesheet :startDate,:endDate");
        query.setDate("startDate", formatter.parse(startDate));
        query.setDate("endDate", formatter.parse(endDate));
        query.setResultTransformer(Transformers.aliasToBean(UnSubmittedTimesheetBean.class));
List queryList=query.list();

有时sp结果返回所有整数值,有时返回小数值,有时返回固定值。因此,我无法确定特定的数据类型。因此,我遇到了以下异常。
expected type: java.lang.Double actual value: java.lang.Integer 

如何解决这个错误?
非常感谢任何帮助!

我认为你要么需要创建多个存储过程,要么使用单个返回类型(例如decimal),并在需要时将“Double”值转换为“Integer”。 - Thomas
4个回答

1
您的存储过程返回整数数据类型值,我猜测在您的bean中映射的列被定义为Double类型,因此当转换器将结果设置到Bean中时,它会尝试将整数值设置为Double值,从而引发异常...
1> 您可以在Bean类中进行更改(可以将列更改为Integer)。
2> 您可以更改过程的返回类型,以返回双精度。
3> 如果您不允许更改上述任何内容,则可以编写自己的结果转换器,并扩展“AbstractQueryTransformer”。
我更喜欢第二种方法。

你能添加一个选项2的实现例子吗? - C_B
@C_B 找出 Bean 抱怨的是哪个变量。在我的情况下,我从存储过程中返回了一个带有列 Quantity INT(11) 的临时表。Java 中的 Bean 有私有的 Float quantity(getter 和 setter)。我将存储过程中的列更改为 Quantity FLOAT(4,2),然后它就可以工作了。 - veritas

0

我的解决方案是在您的存储过程中添加强制转换,就像 int / decimal 一样。

这样,您可以轻松地处理结果转换器 bean 中的数据类型。 否则,在您的结果转换器中将所有这些字段设置为“Number”,然后根据需要将“Number”对象更改为任何其他内容。


0

最快的解决方案是更改存储过程,使结果始终为双精度数字,而不考虑任何其他因素(您需要更改sp代码,可能还要更改返回类型,因为我不知道您的sp)。 如果您无法触及数据库,则可以构建一个结果转换器,接受整数、浮点数或其他任何类型,并在进行一些处理后将其适应为双精度。


0

我曾经遇到过类似的问题,涉及到两个字段的复杂 SQL 连接。控制台上显示的异常信息是:

期望类型:java.lang.Double 实际值:java.math.BigDecimal

为了解决这个问题,我使用 addScalar() 方法显式地映射了这些字段的数据类型。

session.createSQLQuery(query.toString())
                .addScalar("offerid", StandardBasicTypes.INTEGER)
                .addScalar("offervalue", StandardBasicTypes.DOUBLE)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接