java - Spring数据,Oracle DB,java.sql.SQLException : Numeric Overflow

标签 java oracle hibernate spring-data-jpa spring-data

在我的应用程序(Oracle DB[11g]、Spring data、Java 8)中,我使用如下 ID 映射了我的实体:

@Column(name = "MYID")
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQUENCE")
@SequenceGenerator(sequenceName = "MY_SEQUENCE", allocationSize = 1, name = "MY_SEQUENCE")
private Integer     id;

在 oracle 列中,类型为 NUMBER(38,0)

对于某些数据,当我尝试 findById 时,应用程序会抛出:SQL 错误:17026,SQLState:null - 数字溢出。

我尝试更改 java 实体的类型,例如 long、BigDecimal 和 BigInteger,但我收到来自 Hibernate 的转换 Integer 异常。

我无法更改数据库中表的定义。

如何解决这个问题?

谢谢

最佳答案

如果您的数据库列数据类型定义为 NUMBER(38,0),则永远不应该使用 Integer 数据类型,因为此格式可能存储比单精度整数

更安全的是使用Long,它涵盖 double 整数。要查看您的数据是否在 Long 覆盖的范围内,请执行此查询(替换表和列名称)

select AGE from author_tab 
where not (-power(2,63) <= AGE and AGE <= power(2,63)-1)

如果没有返回数据,您就处于Long的安全范围

作为最后的手段,请使用 BigInteger您可以将其精确修剪为您的数据库数据类型

@Column(precision=38, scale=0)
BigInteger age

关于java - Spring数据,Oracle DB,java.sql.SQLException : Numeric Overflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59757283/

相关文章:

hibernate - 从sessionFactory切换到EntityManager后,InvalidDataAccessApiUsageException

java - 使用hibernate工具生成代码时处理Table name中的 '$'

java - 如何找到父线程的名字?

java - 点击时显示值 [MPAndroidChart]

mysql - SQL如何删除不正确的重复(不正确)值?

SQL命令未正确结束?

linux - DBD-Oracle-1.76 安装问题

java - JPA/Hibernate 连接查询

java - 无法从套接字读取

java - Spring CrudRepository保存方法的自定义返回类型(动态投影)