今天统计报表,发现数据对不上,赶紧开始排查问题,查看服务器日志,发现抛出了如下异常:org.hibernate.exception.SQLGrammarException: 从数据类型 nvarchar 转换为 decimal 时出错
数据库环境是sqlserver 2008 r2
问题排查步骤:
1.检查代码,没有发现业务逻辑问题
2.检查数据库字段,发现类型为numeric(32,0),于是改为numeric(32,11),异常依旧
3.模拟数据,打断点进行调试,最终发现问题,在调用BigDecimal构造方法的时候传入了double类型,导致精度丢失,小数点后的长度超过了数据库字段的最大长度
结论
在调用BigDecimal构造方法的时候,将数字转化为字符串,否则存在精度丢失问题,可能引发一系列问题,尤其涉及到金额的字段