1. 程式人生 > >Spring Data Jpa 基於註解的級聯查詢

Spring Data Jpa 基於註解的級聯查詢

公司最近還是在使用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屬性

苟利程式設計生死以,豈因BUG趨避之