hibernate native Sql Rounding necessary 解决

大家在执行native sql时,如果有金额的时候,获取list()时,如果你不设置其类型那么总会报java.lang.ArithmeticException: Roundingnecessary错误。但是如果你金额小数位为0的时候就没问题。

这个原因是因为hibernate在封装数据的时候,获取数据类型判断错误造成,这个问题也不能说是hibernate的bug,因为在你不设置指定的字段的类型,hibernate会使用自己默认的类型。

defaults= HashMap<K,V>

{1=character, 2=big_decimal, 3=big_integer, 4=integer, 5=short, 2004=blob, 6=float, 2005=clob, 8=double, 12=string,

93=timestamp, -7=boolean, 92=time, -6=byte, -5=big_integer, -3=binary, -2=binary, 91=date, -1=string}

而jdk获取字段类型的方法是

ResultSetMetaData .getColumnType(index);

数值的类型返回3 其类型是DECIMAL

到这原因就很明显了。

数据库咱们是保留精度的,但是hibernate默认是不保留精度的。

所以hibernate执行

 

 

public Object get(ResultSet rs, String name)

throws HibernateException, SQLException {

//return rs.getBigDecimal(name).toBigIntegerExact(); this 1.5 only. 

BigDecimal bigDecimal = rs.getBigDecimal(name);

return bigDecimal==null ? null : 

bigDecimal.setScale(0, BigDecimal.ROUND_UNNECESSARY).unscaledValue();

}

到此大家应该知道怎么解决了吧。

设置每一列的返回类型sqlquery.addScalar("SUMID",Hibernate.DOUBLE);

由于我现在的项目的列有很多都是动态的,不固定所以设置起来比较麻烦,所以我就修改了下hibernate.jar,不用设置类型。如果谁想要,shmilyfeng3@163.com联系我吧。

 

 jar包下载地址

http://download.csdn.net/download/cheneyfeng3/3467410

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值