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

Spring Boot从PostgreSQL获取jsonb字段时Null值处理异常求助

解决Spring Boot+PostgreSQL jsonb字段Null值处理问题

问题根源

  1. INNER JOIN过滤无关联数据:原查询使用INNER JOIN,导致没有对应District的State记录被直接过滤,无法返回。
  2. 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记录,无论是否存在关联的District
  • filter (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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:25:10