You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:43:47