多对一的 JPA 标准 API 规范
Posted
技术标签:
【中文标题】多对一的 JPA 标准 API 规范【英文标题】:JPA Criteria API Specification for Many to One 【发布时间】:2021-05-10 12:26:30 【问题描述】:我有两张表 Student 和 Address。一个学生可以有多个地址。 实体看起来像这样
@Entity @Table(name = "STUDENT")
public class Student
@Column(name = "STUDENT_ID") Integer studentId;
@Column(name = "FIRST_NAME") String fName;
@Column(name = "LAST_NAME") String LName;
@Entity @Table(name = "ADDRESS")
public class Address
@Column(name = "ADDRESS_ID") Integer addressId;
@Column(name = "STREET_NAME") String street_name;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "STUDENT_ID")
private Student student;
我需要使用 JPA Criteria 来获取基于学生 fName 和 LName 的所有地址。可以是INNER JOIN,也可以是Address表的子查询。
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Address> criteriaQuery = builder.createQuery(Address.class);
Root<Address> fromAddress = criteriaQuery.from(Address.class);
//Can be a JOIN or Sub-Query.
em.createQuery(criteriaQuery).getResultList();
要求是现在才加载地址表数据。
【问题讨论】:
【参考方案1】: CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Address> criteriaQuery = builder.createQuery(Address.class);
Root<Address> fromAddress = criteriaQuery.from(Address.class);
//join
Join<Address, Student> studentJoin = fromAddress.join("student");
//where
criteriaQuery.where(builder.and(
builder.equal(studentJoin.get("fName"), fName),
builder.equal(studentJoin.get("lName"), lName)
));
//projection
criteriaQuery.select(fromAddress);
return em.createQuery(criteriaQuery).getResultList();
【讨论】:
以上是关于多对一的 JPA 标准 API 规范的主要内容,如果未能解决你的问题,请参考以下文章
spring-boot-jap-layui-mysql 完整的jpa多对一