Mybatis查询BigInteger时触发NumberFormatException错误求助
解决MyBatis查询时BigInteger相关的NumberFormatException问题
这个问题我之前也碰到过,核心原因就是你要处理的数值 9825443693488766976 已经超出了Java里Long类型的最大值(9223372036854775807),更不用说Integer类型了——MyBatis在尝试把数据库中的大数值映射到过小的Java数值类型时,就会抛出NumberFormatException。
具体原因分析
- 数据库中存储的字段类型可能是无符号大整数(比如MySQL的
BIGINT UNSIGNED),或者存储的数值本身就超过了Long的上限; - 你的实体类对应字段使用了
Integer或Long类型,无法容纳这么大的数值; - MyBatis默认的类型处理器会尝试把数据库数值转换成你指定的Java基本类型/包装类,超出范围就会触发转换异常。
解决方案
下面是几个可行的解决办法,按推荐程度排序:
1. 修改实体类字段类型为BigInteger
直接把实体类中对应字段的类型从Integer/Long改成java.math.BigInteger,这是最直接的方案:
// 原来的代码 // private Long transactionId; // 修改后的代码 private BigInteger transactionId;
MyBatis会自动使用BigIntegerTypeHandler来处理这种类型的映射,无需额外配置。
2. 在Mapper XML中指定类型处理器
如果不想修改实体类类型,可以在ResultMap中显式指定使用BigIntegerTypeHandler来处理该字段:
<resultMap id="JobTransactionResultMap" type="com.yourpackage.JobTransaction"> <!-- 其他字段映射 --> <result column="transaction_id" property="transactionId" typeHandler="org.apache.ibatis.type.BigIntegerTypeHandler"/> </resultMap>
3. 检查数据库字段类型与Java类型的匹配
如果你的业务场景不需要这么大的数值,可以考虑调整数据库字段类型(比如从BIGINT UNSIGNED改成BIGINT),但这只适用于数值确实不会超出Long范围的情况,不推荐用于已有大量数据的生产环境。
额外排查步骤
- 先确认数据库中该字段的实际存储值和类型,确保数值确实超出了
Long的上限; - 检查Mapper接口方法的返回值类型,确保集合中的泛型类型也对应修改为
BigInteger(如果是集合查询的话)。
内容的提问来源于stack exchange,提问作者dev007
相关产品推荐
相关产品推荐

