Spring Boot从PostgreSQL获取jsonb字段时Null值处理异常求助
解决Spring Boot+PostgreSQL jsonb字段Null值处理问题
问题根源
- INNER JOIN过滤无关联数据:原查询使用
INNER JOIN,导致没有对应District的State记录被直接过滤,无法返回。 - jsonb_agg无数据时返回Null:当State没有关联的District时,
jsonb_agg聚合结果为null,无法映射为期望的空List<DistrictDto>。
修复方案
1. 修改JPQL查询语句
将INNER JOIN改为LEFT JOIN保留所有State记录,并通过coalesce+filter处理聚合结果,确保无数据时返回空JSON数组:
@Query("select new com.rainbow.customer.rainbowcustomerservice.user.model.users.StateWiseDistrictResponse( " + "s.id, s.name, coalesce(jsonb_agg(json_build_object( 'id', d.id, 'name', d.name, 'stateId', s.id)) filter (where d.id is not null), '[]'::jsonb)) " + "from State s " + "left join District d on d.stateId.id = s.id " + "where (:nullToken is null or s.id in(:stateId)) " + "group by s.id") List<StateWiseDistrictResponse> stateWiseDistrict(List<BigInteger> stateId, String nullToken);
LEFT JOIN:保留所有State记录,无论是否存在关联的Districtfilter (where d.id is not null):避免将无关联District时的null对象聚合到结果中coalesce(..., '[]'::jsonb):当聚合结果为null时,替换为空JSON数组
2. 增强模型类鲁棒性
在模型类中初始化districtList为空列表,避免映射后出现null值:
@Data @Builder @Getter @Setter @NoArgsConstructor @AllArgsConstructor public class StateWiseDistrictResponse { private BigInteger id; private String name; @Type(type = "jsonb") private List<DistrictDto> districtList = new ArrayList<>(); }
3. 确认字段映射匹配
确保DistrictDto的字段与json_build_object生成的JSON字段完全匹配(字段名一致,或通过@JsonProperty指定对应关系),示例:
@Data public class DistrictDto { private BigInteger id; private String name; private BigInteger stateId; }
内容的提问来源于stack exchange,提问作者Jayanta Karmakar
相关产品推荐
相关产品推荐

