簡體   English   中英

如何在 Spring Data jpa 中應用本機連接查詢?

[英]How can i apply native join query in spring data jpa?

這是我的實體類。

招聘信息.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;
    
}

求職申請.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;

}

我的主要目標是要上市的JobPostIdApplicantList。 我對 Spring 數據 JPA 完全陌生。 JPA 映射是否正確? 我不知道應該觸發哪個查詢才能根據 jobPostId 獲取申請者列表。

我建議使用 JpaMappings 並使用 SpringData 而不是使用本機查詢。 要遵循的步驟:多對多:

使用JoinTable 直接映射JobPost 和Applicant,而不是單獨創建一個類。

幫助鏈接: 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);

我認為您應該以這種方式配置映射。為此,您只需要兩個實體 JobPost.java

    @Entity
    @Table(name = "job_post")
    public class JobPost {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @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;
    
        @ManyToMany
        @JoinTable(name = "applicant_job_post",
                joinColumns = {
                        @JoinColumn(name = "job_post_id", referencedColumnName = "id")
                }, inverseJoinColumns = {
                @JoinColumn(name = "applicant_id", referencedColumnName = "id")
        })
        private Set<Applicant> applicants;
    
        public JobPost() {
        }
    
        public void addApplicant(Applicant applicant) {
            applicants.add(applicant);
            applicant.getJobPosts().add(this);
        }
    
        public void removeApplicant(Applicant applicant) {
            applicants.remove(applicant);
            applicant.getJobPosts().remove(this);
        }
   }

申請人.java

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

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

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

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

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

    @ManyToMany(mappedBy = "applicants")
    private Set<JobPost> jobPosts;

    public Applicant() {
    }

    public void addJobPost(JobPost jobPost) {
        jobPosts.add(jobPost);
        jobPost.getApplicants().add(this);
    }

    public void removeJobPost(JobPost jobPost) {
        jobPosts.remove(jobPost);
        jobPost.getApplicants().remove(this);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM