升级至Spring 3.1.0 & Java 17后出现数值溢出错误,求解决方案
解决Spring 3.1.0 + Java 17升级后的Oracle数值溢出问题
问题根源
从错误栈可以明确:代码尝试用getInt()读取Oracle数据库中超出Java int范围(-2147483648 ~ 2147483647)的数值,导致溢出。升级到Spring 3.1.0和Java 17后,Hibernate/JDBC的类型映射逻辑更严格,或是数据库中部分字段的实际存储值超出了实体类定义的Integer类型上限。
可行解决方案
修正实体类与数据库字段的类型匹配
检查实体类中对应字段的类型:如果数据库字段是NUMBER(10,0)及以上精度的类型,存储值大概率会超出Javaint范围,直接把实体类字段类型从Integer改为Long即可。
示例代码:// 原代码 private Integer orderId; // 修改后 private Long orderId;同时要确认数据库字段的存储范围,确保
Long(最大9223372036854775807)能覆盖所有现有数据。调整Hibernate类型映射(临时方案)
如果暂时无法修改实体类类型,可通过注解强制Hibernate用更大的类型读取数据,但这种方式存在数据截断风险,仅作临时过渡使用:@Column(columnDefinition = "NUMBER(10,0)") @Type(type = "long") private Integer orderId;升级Oracle JDBC驱动
旧版Oracle JDBC驱动在Java 17环境下可能存在数值类型处理的兼容性问题,替换为兼容Java 11+的ojdbc11最新版本:<!-- Maven依赖示例 --> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc11</artifactId> <version>23.3.0.23.09</version> </dependency>检查自定义SQL的数值转换
排查业务中的自定义SQL,确认是否存在CAST(large_column AS INT)这类强制转换为int的逻辑,这类操作会在数据库端截断数值,导致读取时溢出,需修改为CAST(large_column AS NUMBER)或直接使用原字段。
验证步骤
- 执行
SELECT MAX(column_name), MIN(column_name) FROM your_table,确认所有数据都在修改后类型的范围内; - 重启服务后执行触发错误的业务操作,确认溢出问题消失。
内容的提问来源于stack exchange,提问作者Sri
相关产品推荐
相关产品推荐

