我使用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
如何解决此错误?
任何帮助将不胜感激!!!
答案 0 :(得分:0)
你的存储过程返回Integer数据类型值,我猜你的bean中映射列被定义为Double,所以当Transformer要在Bean中设置结果时,它试图将Integer值设置为Double值,并且它是抛出异常...
1>您可以在Bean类中进行更改(可以将列设置为整数)。
2 - ;您可以更改将返回Double Precision的返回类型的过程。
3>并且你们中很复杂的人不允许改变以上任何一种你可以通过扩展" AbstractQueryTransformer"来编写你自己的结果变换器。
我更喜欢第二个。
答案 1 :(得分:0)
我的解决方案是在存储过程中添加转换为int / decimal
这样您就可以轻松处理结果转换器bean中的数据类型。 否则在结果变换器中将所有这些字段设为“Number”,然后根据需要将“Number”对象更改为任何其他字段。
答案 2 :(得分:0)
最快的解决方案,更改存储过程,以便结果始终是双精度数,无论什么(您都需要更改sp代码,可能是返回类型,因为我不知道你的sp)。 解决方法,如果你不能触摸数据库:构建一个结果转换器以接受整数,浮点数等等,并在进行一些处理后将其容纳为双精度。
答案 3 :(得分:0)
我面对2个字段的复杂SQL连接遇到了类似问题。控制台上显示的例外是
预期类型:java.lang.Double实际值:java.math.BigDecimal
为解决这个问题,我使用addScalar()方法为这些字段显式映射了数据类型
session.createSQLQuery(query.toString())
.addScalar("offerid", StandardBasicTypes.INTEGER)
.addScalar("offervalue", StandardBasicTypes.DOUBLE)