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