JAVA 在处理 numeric 类型(如期初金额)时,底层接收数据库返回的值 有时会随机 变成小于8个字节的情况,导致Java执行 numeric转换时,小于8个字节就报异常:
数据库结构:
mybatis 语句如下:
<select id="getInitMoney" resultType="java.lang.String">
SELECT /*+ set(query_dop 16) */
COALESCE(SUM(ca.js_money),0)::numeric(20,6) as js_money FROM v_check_account ca
WHERE
ca.corp_id = #{query.corpId,jdbcType=BIGINT}
AND ca.trader_id = #{query.traderId,jdbcType=BIGINT}
AND ca.acc_date < #{query.startDate,jdbcType=INTEGER}
</select>
接口:
String getInitMoney(@Param("query") CheckAccountQuery query);
处理方式:
String initStr = reportDao.getInitMoney(query);--这行报异常
BigDecimal init = BigDecimal.valueOf(Double.parseDouble(initStr));
这个要怎么处理才好哇。它就是随机的,有时异常,有时又正常。
我查deepseek,说是 可能3种情况:
1、高斯数据库驱动版本过低(目前postgresql的依赖包是42.7.5,我搜了下已经是最新的了);
2、联系数据库管理员,确认是否配置numeric返回8个字节以上(等待答复);
3、这个试过不行,即使将自己处理到8位以上,还会其他可能异常等着:
你这不是格式的问题,这明明是字符串的 0.000, 你应该调用字符串的转换,不应该调用bytes的转换
mybatis不熟悉,不清楚怎么个转换,不过这里直接string转BigDecimal就行了,不需要经过bytes.
试试resultType用java.math.BigDecimal行不行.
哎,是 “/*+ set(query_dop 16) */” 的问题,去掉了 转换字节流的问题就好了,但是查询会很慢。
询问华为说建议换个 高斯数据库驱动看看,还在研究官方文档中。。