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‘

java之BigInteger类

[记录]java.math.biginteger cannot be cast to java.lang.long

java怎么把16进制的数转换为10进制的