Oracle转PostgreSQL遇类型转换错误:BigInteger无法转为BigDecimal
为啥Oracle环境下的代码能正常运行,PostgreSQL却报类型转换错?
这事儿核心是两个数据库对序列返回值的JDBC映射类型不一样:
Oracle这边的情况
- Oracle里序列的
NEXTVAL返回的是NUMBER类型,JDBC驱动会把这个类型直接映射为java.math.BigDecimal。所以你原代码里把查询结果强转成BigDecimal完全匹配,自然不会出问题。至于from DUAL只是Oracle用来执行无表查询的虚表语法,不影响返回值的类型映射。
PostgreSQL这边的差异
- PostgreSQL默认创建的序列返回的是
BIGINT类型,JDBC驱动会把它映射为java.math.BigInteger。这时候你还强行把结果转成BigDecimal,就会触发java.math.BigInteger cannot be cast to java.math.BigDecimal的异常了。
给你个快速解决办法
如果想继续用BigDecimal接收结果,有两种方式:
- 把查询结果显式转成PostgreSQL的
numeric类型(对应JDBC的BigDecimal):Query query = getEntityManager().createNativeQuery("SELECT NEXTVAL('pc_site_group_id_seq')::numeric"); BigDecimal result = (BigDecimal) query.getSingleResult(); - 先接收为
BigInteger再转成BigDecimal:BigInteger seqValue = (BigInteger) query.getSingleResult(); BigDecimal result = new BigDecimal(seqValue);
内容的提问来源于stack exchange,提问作者Rajat Mishra
相关产品推荐
相关产品推荐

