我有以下表格:
-
客户
-
订单
@Entity public class Customer { String id; } @Entity public class Order { String id; String customerId; }
我没有用在它们之间建立实体的映射;然而,我需要一个查询,它应该连接这两个表:
final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
final CriteriaQuery<Customer> criteriaQuery = criteriaBuilder.createQuery(Customer.class);
final Root<Customer> root = criteriaQuery.from(Customer.class);
final Join<Order, Customer> joinOrder = root.join(Order_.customerId.getName()); // doesn't work
final TypedQuery<Customer> queryData = entityManager.createQuery(
criteriaQuery
.where(
criteriaBuilder.lessThan(root.get(Customer_.creationDate), date)
// should add a predicate with order properties
)
);
return queryData.getResultList();
有没有可能用JPA2做类似上面的事情?
- 您可以使用子查询
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Customer> customerQuery =
cb.createQuery(Customer.class);
Root<Customer> customerRoot = customerQuery.from(Customer.class);
Subquery<Order> subQuery = customerQuery.subquery(Order.class);
Root<Order> orderRoot = subQuery.from(Order.class);
//Replace this with the restriction you want to apply to order
Predicate predicate= orderRoot.get("xxxxx").in(xxx, xxx);
subQuery.select(orderRoot.get("customerId")).where(predicate);
customerQuery.select(customerRoot).where(customerRoot.get("id").in(subQuery));
em.createQuery(issueQuery).getResultList();