Spring Data Jpa 基於註解的級聯查詢
阿新 • • 發佈:2018-11-01
公司最近還是在使用spring data jpa,自己練習時遇到一些坑,記錄一下
首先描述一些業務邏輯:
一共有兩張表,一張學生表,一張公司表,學生與公司屬於一對多的關係,即一個學生只能屬於一個公司,但是一個公司可以擁有多名學生
學生實體類:
package com.sj.Entity; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; import java.io.Serializable; import java.util.Objects; @Entity @Table(name = "student", schema = "public", catalog = "taihua") public class StudentEntity implements Serializable { private String id; private String name; private String sex; private String remark; private CompanyEntity company; @Id @Column(name = "id") @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", strategy = "uuid") public String getId() { return id; } public void setId(String id) { this.id = id; } @Basic @Column(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @Basic @Column(name = "sex") public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Basic @Column(name = "remark") public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } @ManyToOne @JoinColumn(name="company_id") public CompanyEntity getCompany() { return company; } public void setCompany(CompanyEntity company) { this.company = company; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; StudentEntity that = (StudentEntity) o; return Objects.equals(id, that.id) && Objects.equals(name, that.name) && Objects.equals(sex, that.sex) && Objects.equals(remark, that.remark); } @Override public int hashCode() { return Objects.hash(id, name, sex, remark); } @Override public String toString() { return "學生{" + "學號='" + id + '\'' + ", 姓名='" + name + '\'' + ", 性別='" + sex + '\'' + ", 備註='" + remark + '\'' + ", 單位=" + company + '}'; } }
公司實體類:
package com.sj.Entity; import javax.persistence.*; import java.util.Objects; @Entity @Table(name = "company", schema = "public", catalog = "taihua") public class CompanyEntity { private String companyId; private String companyName; @Id @Column(name = "company_id") public String getCompanyId() { return companyId; } public void setCompanyId(String companyId) { this.companyId = companyId; } @Basic @Column(name = "company_name") public String getCompanyName() { return companyName; } public void setCompanyName(String companyName) { this.companyName = companyName; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; CompanyEntity that = (CompanyEntity) o; return Objects.equals(companyId, that.companyId) && Objects.equals(companyName, that.companyName); } @Override public int hashCode() { return Objects.hash(companyId, companyName); } @Override public String toString() { return "公司:{" + "公司編號='" + companyId + '\'' + ", 公司名稱='" + companyName + '\'' + '}'; } }
repository層程式碼:
package com.sj.Repository; import com.sj.Entity.StudentEntity; import org.springframework.data.jpa.repository.JpaRepository; public interface IStudentRepository extends JpaRepository<StudentEntity,String> { //StudentEntity findByName(String name); //StudentEntity readByName(String name); /*** *級聯查詢的方法 ***/ StudentEntity getByCompanyCompanyId(String companyId); }
業務需求,根據公司編號查詢學生資訊
其實沒什麼技術難點,唯一需要注意的就是JPA方法的命名:
在JPA的級聯查詢中,find/get/rebdBy後跟的是本身的屬性名,之後是關聯實體類的屬性名,
比如,根據公司編號查詢學生資訊
getByCompanyCompanyID
getBy:jpa方法命名規範
company:學生實體類的company屬性
companyId :公司實體類的companyId屬性