预期类型:java.lang.Double实际值:hibernate中的java.lang.Integer错误

预期类型:java.lang.Double实际值:hibernate中的java.lang.Integer错误,java,spring,hibernate,exception,Java,Spring,Hibernate,Exception,我使用createSqlQuery接口调用hibernate中的存储过程,并使用结果转换器以bean的形式获取结果。 下面是我的代码 Query query=sessionfactory.getCurrentSession().createSQLQuery("exec usp_ListUsersNotSubmitTimesheet :startDate,:endDate"); query.setDate("startDate", formatter.parse(startDate

我使用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 result返回所有整数值,有时返回十进制数值,有时是固定的。因此,我无法给出具体的数据类型。 所以我得到了下面的例外

expected type: java.lang.Double actual value: java.lang.Integer 
如何解决此错误


任何帮助都将不胜感激

您的存储过程正在返回整型数据类型值,我猜在您的bean中,映射列被定义为Double,因此当Transformer要在bean中设置结果时,它试图将整型值设置为Double值,并且在那里它抛出异常

1> 您可以在Bean类中进行更改(可以将列设置为整数)

2> 您可以更改返回双精度过程的返回类型

3> 复杂的是,你们不能改变上面的任何一个,你们可以通过扩展“AbstractQueryTransformer”来编写自己的结果转换器


我更喜欢第二个。

我的解决方案是在存储过程中添加强制转换,即int/decimal

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

最快的解决方案是,更改存储过程,使结果始终为双精度数,而不管发生什么(您需要更改sp代码,可能是返回类型,因为我不知道您的sp)。
如果你不能接触数据库,解决方案是:构建一个结果转换器来接受integer、float等,并在进行一些处理后将其调整为double。

我遇到了两个字段的复杂SQL连接。控制台上显示的异常是

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

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


我建议您要么创建多个存储过程,要么使用一个返回类型(例如decimal)如果需要,将
Double
值转换为
Integer
。您可以为选项2添加一个实现示例吗?@C_B找出Bean抱怨的是哪个变量。在我的例子中,我从过程中返回了一个临时表,其中包含列Quantity INT(11)。Java中的Bean具有私有Float Quantity(getter和setter)。我将存储过程中的列更改为Quantity FLOAT(4,2),它成功了。
session.createSQLQuery(query.toString())
                .addScalar("offerid", StandardBasicTypes.INTEGER)
                .addScalar("offervalue", StandardBasicTypes.DOUBLE)