【问题标题】:JPA Criteria API Specification for Many to One多对一的 JPA 标准 API 规范
【发布时间】: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();

要求是现在才加载地址表数据。

【问题讨论】:

    标签: java jpa spring-data-jpa many-to-one criteriaquery


    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 2018-09-06
      • 2019-12-07
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 2017-08-19
      • 2018-05-07
      • 1970-01-01
      • 2016-02-04
      相关资源
      最近更新 更多