jpa2.2.10 EntityManager CriteriaBuilder 避免查询某个关联表,有效写法有哪些,具体怎么写,写详细点
时间: 2024-05-09 13:17:08 浏览: 86
对于避免查询某个关联表,可以采用以下方式:
1. 使用Fetch Join:可以一次性查询出所有需要的信息,避免了N+1的问题。示例代码如下:
```java
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Order> query = cb.createQuery(Order.class);
Root<Order> orderRoot = query.from(Order.class);
Join<Order, Customer> customerJoin = orderRoot.join(Order_.customer, JoinType.INNER);
Fetch<Order, OrderDetail> fetchOrderDetail = orderRoot.fetch(Order_.orderDetails, JoinType.LEFT);
List<Order> results = entityManager.createQuery(query)
.getResultList();
```
2. 使用Subquery:可以先查询出需要的关联表的主键,再使用IN方式查询Main Query中需要的结果。示例代码如下:
```java
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaBuilder subCb = entityManager.getCriteriaBuilder();
CriteriaQuery<Integer> subquery = subCb.createQuery(Integer.class);
Root<Customer> subRoot = subquery.from(Customer.class);
subquery.select(subRoot.get(Customer_.id));
Predicate subPred = subRoot.get(Customer_.age).greaterThan(18);
CriteriaQuery<Order> query = cb.createQuery(Order.class);
Root<Order> orderRoot = query.from(Order.class);
Predicate mainPred = orderRoot.get(Order_.customer).get(Customer_.id).in(subquery);
query.where(mainPred);
List<Order> results = entityManager.createQuery(query)
.getResultList();
```
以上两种方法可以避免查询某个关联表,让查询更高效。
阅读全文