在我的应用程序(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/