hibernate native Sql Rounding necessary 解决

  • Post author:
  • Post category:其他


大家在执行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



版权声明:本文为cheneyfeng3原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。