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