在我的应用程序(Oracle DB [11g],Spring数据,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异常。

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

如何解决这个问题?

谢谢

最佳答案

如果将数据库列数据类型定义为Integer,则永远不要使用NUMBER(38,0)数据类型,因为此格式存储的数字可能比单精度Integer大得多。

更安全的是使用Long,它覆盖双精度整数。要查看您的数据是否在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

08-07 05:12
查看更多