Home > OS >  Spring JPA Criteria API Query on OneToMany List Field
Spring JPA Criteria API Query on OneToMany List Field

Time:11-17

I want to load all the CustomerRequests for a specific Customer with the JPA/Hibernate Criteria API.

In specific: I want to load all the CustomerRequest for which a CustomerRequest2Customer entry with a specific customerId exists.

@Entity
public class CustomerRequest {
    @Id
    private int id;
    private int priority;
    @OneToMany(mappedBy = "customerRequestId")
    private List<CustomerRequest2Customer> listCustomerRequestToCustomer; //  <- Query this field         
}

@Entity
public class CustomerRequest2Customer {
    @Id
    private int id;
    @ManyToOne
    private Customer customer; //  <- Query this field
    @ManyToOne
    private CustomerRequest customerRequest;
}

@Entity
public class Customer {
    @Id
    private int id; //  <- Query this field
    private String name;
}

How I currently query other fields:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<CustomerRequest> cq = 
cb.createQuery(CustomerRequest.class);
Root<CustomerRequest> root = cq.from(CustomerRequest.class);
cq.where(cb.equal(root.get("priority"), 1));
return entityManager.createQuery(cq).getResultList();

CodePudding user response:

You have to join the entities like this:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<CustomerRequest> cq = cb.createQuery(CustomerRequest.class);

Root<CustomerRequest> root = cq.from(CustomerRequest.class);
Join<CustomerRequest, CustomerRequest2Customer> customerRequest2Customer = root.join("listCustomerRequestToCustomer");
Join<CustomerRequest2Customer, Customer> customer = customerRequest2Customer .join("customer");

cq.where(cb.equal(customer .get("id"), 1));

return entityManager.createQuery(cq).getResultList();
  • Related