java.math.BigInteger 不能转换为 java.math.BigDecimal
Posted
技术标签:
【中文标题】java.math.BigInteger 不能转换为 java.math.BigDecimal【英文标题】:java.math.BigInteger cannot be cast to java.math.BigDecimal 【发布时间】:2018-01-23 09:38:26 【问题描述】:我们正在从 Oracle 迁移到 PostgreSQL。某些特定于 Oracle 的查询必须更改为 Postgres 等效项。以下是一个这样的提交:
最初,
Query query = getEntityManager().createNativeQuery("SELECT PC_SITE_GROUP_ID_SEQ.NEXTVAL from DUAL");
BigDecimal result = (BigDecimal) query.getSingleResult();
改为,
Query query = getEntityManager().createNativeQuery("SELECT NEXTVAL('pc_site_group_id_seq')");
BigDecimal result = (BigDecimal) query.getSingleResult();
运行时,修改后报错,
我的问题是为什么它以前可以工作? 提醒一下,第一个更改是在 Oracle 数据库上运行的,而第二个更改是在 Postgres 数据库上运行的。请帮忙。
【问题讨论】:
“我的问题是为什么它以前可以工作” - 只是猜测,但它可能是 oracle jdbc 驱动程序将值映射到BigDecimal
。 “DUAL”在这里是什么意思?你是如何定义你的序列的?在 Oracle 案例中可能是浮点数/定点数吗?
@Thomas 这是预言机“语法需要一个表,但不需要一个表,所以使用 DUAL 作为假表”的方式。
@Kayaman 我的版本是 11.2.0.3.0。
@Life_Hacker 可能是您使用的 Oracle DB 驱动有问题,您可以尝试使用最新的 DB 驱动。
我无法使用 Oracle。如前所述,我们正在从中迁移。
【参考方案1】:
Oracle 在数据库中没有“整数”数据类型,因此驱动程序将所有内容都映射到 BigDecimal。
在 Postgres 中,整数(或 bigint)和小数之间有明显的区别,因此驱动程序为 bigint
值返回 BigInteger。
并且序列总是发出bigint
值,因此驱动程序会为它们返回BigInteger
。
【讨论】:
你能看一下这个url吗,docs.oracle.com/cd/B12037_01/server.101/b10759/… 上面提到nextVal
会返回一个integer
@Jobin:Oracle 没有原生的integer
数据类型。一切都是number
,可以包含小数。无论 Oracle 服务器 发送什么,驱动程序都将其转换为 BigDecimal。加上序列的默认最大值将适合 BigInteger - 因此驱动程序必须使用BigDecimal
BigDecimal(BigDecimal,无精度(大整数 Postgres 或双精度))在 Oracle 和 Postgres db 中它具有使用整数数据类型的等效列。
所以这只是甲骨文是甲骨文的一个例子。
@Kayaman:不,真的。 BigDecimal
是驱动程序的唯一选择,因为序列的潜在值(实际上通常是 number
)不适合 BigInteger
以上是关于java.math.BigInteger 不能转换为 java.math.BigDecimal的主要内容,如果未能解决你的问题,请参考以下文章
如何解决 java.math.BigInteger 无法转换为 java.lang.Integer?
ClassCastException:java.math.BigInteger 在连接到 MySQL 时无法转换为 java.lang.Long
java Operator ‘/‘ cannot be applied to ‘java.math.BigInteger‘, ‘int‘