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

Spring Boot中PostgreSQL下JpaRepository查询返回列名问题

问题分析

你当前的JPQL查询返回的是Object数组列表,因为你明确指定了要查询a.applicant, a.reviewed, a.status这三个独立字段。JSON序列化时,数组元素只会按顺序输出,不会带上字段名,所以才会出现[Applicant对象, null, null]的结果,没有"reviewed":null这样的键值对结构。

解决方案

这里有几种简单的调整方式,都能让返回结果带上字段名:

方法1:查询完整的JobApplicants实体

如果不需要过滤字段,直接查询整个实体是最简单的方式,这样所有字段(包括reviewed、status和关联的applicant)都会被正确序列化,即使值为null也会显示对应的键名:

@Query("select a from JobApplicants a where a.job.id = ?1") 
List<JobApplicants> getOnlyApplicants(UUID jobId);

返回的JobApplicants对象会包含所有属性,序列化后会呈现类似:

{
  "id": "109ca778-8526-40c6-a9dd-1f4e6ef2fef7",
  "status": null,
  "reviewed": null,
  "applicant": {
    "id": "bca4ed5c-b81a-420d-8b8b-9130d815d5f1",
    "firstName": "Xxxx",
    // ... 其他Applicant字段
  },
  // ... 其他JobApplicants字段
}

方法2:使用DTO投影(推荐如果只需要特定字段)

如果你只想返回applicant、reviewed、status这三个字段,可以创建一个DTO类来封装结果:

// 请替换成你的实际包路径
public class ApplicantReviewDTO {
    private Applicant applicant;
    private Boolean reviewed;
    private String status;

    // 必须提供与查询字段顺序匹配的构造函数
    public ApplicantReviewDTO(Applicant applicant, Boolean reviewed, String status) {
        this.applicant = applicant;
        this.reviewed = reviewed;
        this.status = status;
    }

    // 必须添加getter方法,JSON序列化需要依赖这些方法获取字段名
    public Applicant getApplicant() {
        return applicant;
    }

    public Boolean getReviewed() {
        return reviewed;
    }

    public String getStatus() {
        return status;
    }
}

然后修改查询语句,使用new关键字调用DTO的构造函数:

@Query("select new com.yourpackage.ApplicantReviewDTO(a.applicant, a.reviewed, a.status) from JobApplicants a where a.job.id = ?1") 
List<ApplicantReviewDTO> getOnlyApplicants(UUID jobId);

这种方式返回的是DTO对象列表,序列化后会生成你想要的结构:

{
  "applicant": {
    "id": "bca4ed5c-b81a-420d-8b8b-9130d815d5f1",
    // ... Applicant字段
  },
  "reviewed": null,
  "status": null
}

方法3:使用接口投影

另一种轻量的方式是定义一个投影接口,Spring Data JPA会自动生成代理类实现这个接口:

public interface ApplicantReviewProjection {
    Applicant getApplicant();
    Boolean getReviewed();
    String getStatus();
}

修改查询语句时,需要给每个字段指定别名(与接口的方法名对应):

@Query("select a.applicant as applicant, a.reviewed as reviewed, a.status as status from JobApplicants a where a.job.id = ?1") 
List<ApplicantReviewProjection> getOnlyApplicants(UUID jobId);

这种方式不需要创建实体类,同样能返回带字段名的JSON结构。

内容的提问来源于stack exchange,提问作者SpaceOso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:19:56