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
相关产品推荐
相关产品推荐

