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