首页 > 解决方案 > 如何在 Spring Data jpa 中应用本机联接查询?

问题描述

这是我的实体类。

JobPost.java

@Entity
@Table(name = "job_post")
public class JobPost {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "job_post_id")
    private Long jobPostId;

    @Column(name = "job_title")
    private String jobTitle;

    @Column(name = "job_description")
    private String jobDescription;

    @Column(name = "vacancy")
    private int vacancy;

    @Column(name = "posted_date")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date postedDate;

    @Column(name = "total_applicants")
    private int totalApplicants;
    
}

JobApplication.java

@Entity
@Table(name = "job_application")
public class JobApplication {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "job_application_id")
    private Long jobApplicationId;

    @Column(name = "job_post_id")
    private Long jobPostId;

    @Column(name = "applicant_id")
    private Long applicantId;
}

申请人.java

@Entity
@Table(name = "applicant")
public class Applicant {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "applicant_id")
    private Long applicantId;

    @Column(name = "applicant_name")
    private String applicantName;

    @Column(name = "applicant_mobile_no")
    private String applicantMobileNo;

    @Column(name = "applicant_email")
    private String applicantEmail;

}

我的主要目标是在JobPostId上列出申请人列表。我是 Spring data JPA 的新手。JPA 映射是否正确?我不知道应该触发哪个查询才能根据 jobPostId 获取申请者列表。

标签: javasqlspringspring-data-jpanativequery

解决方案


我建议使用 JpaMappings 并使用 SpringData 而不是使用本机查询。遵循的步骤: 多对多:

使用 JoinTable 直接映射 JobPost 和申请人,而不是创建单独的类。

链接寻求帮助: https ://attacomsian.com/blog/spring-data-jpa-many-to-many-mapping

使用 SpringData JPA findOne 或 findById 方法(取决于 spring 版本)。如果您使用 EAGER fetch,那么它将为您提供与 JobPost Id 关联的所有申请人。

一对多

保留 JobApplication 类并使用 OneToMany 注释。

链接寻求帮助: https ://attacomsian.com/blog/spring-data-jpa-one-to-many-mapping

询问:

@Query("select a from JobPost j inner join j.jobApplicantList ja inner join ja.applicant a where j.jobPostId=:jobPostId")
    List<String> findAllJobApplicants(@Param("jobPostId") Long jobPostId);

推荐阅读