简体   繁体   中英

JPA Criteria API Specification for Many to One

I have two tables Student and Address. One student can have multiple address. Entities looks like this

@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;
}

I need to use JPA Criteria to fetch all addresses based on a student fName and LName. It can be with INNER JOIN or even it can be sub-query for Address table.

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();

Requirement is to load only now Address table data.

    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();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM