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

