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

MongoDB迁Postgres时JPA Repository报Integer转Long转换异常的原因?

根本原因

  • 泛型擦除导致强转未触发异常:Java泛型仅在编译阶段做类型校验,运行期会擦除所有泛型信息。你将user.get("groupIds")返回的列表直接强转为List<Long>时,运行环境只会校验对象是否为List类型,不会检查列表内的元素类型,因此这步不会抛出异常,但此时列表内实际存储的元素是Integer类型而非Long。
  • MongoDB Java驱动的数值映射规则:即使MongoDB中定义groupIds为int64类型,只要数值在Integer的取值范围(-2^31 ~ 2^31-1)内,MongoDB驱动默认会将这类整数值映射为Integer类型存储,只有超出int范围的数值才会被映射为Long。
  • 持久化阶段触发真实类型转换:JPA(Hibernate实现)执行save操作向数据库刷入数据时,需要将groupIds列表的元素转换为和实体类字段定义匹配的Long类型,对应PostgreSQL的bigint字段。此时读取列表元素尝试强转为Long时,发现实际类型是Integer无法直接转换,因此抛出ClassCastException。

解决方案

构建UserGroup对象时主动转换列表元素类型即可,修改代码如下:

List<Integer> rawGroupIds = (List<Integer>) user.get("groupIds");
List<Long> groupIds = rawGroupIds.stream().map(Integer::longValue).collect(Collectors.toList());
UserGroup userGroup = UserGroup.builder()
        .groupIds(groupIds)
        .userName(user.getString("userName"))
        .build();

内容的提问来源于stack exchange,提问作者Jithin M V

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:06:00