【发布时间】:2016-08-16 06:14:38
【问题描述】:
我有一个具有@ManyToOne 关系的实体,我想通过单个查询来检索它,因此使用@Fetch(FetchMode.JOIN)。有时 Hibernate 不尊重这一点并发出 N+1 SELECTs。 有时我的意思是,因为我不知道是什么触发了它,所以我有一些案例在同一个类中针对不同的查询可能会发生或不会发生。
这是一个简化的实体,带有我使用的注释:
@Entity
public class Employee {
@ManyToOne
@Fetch(FetchMode.JOIN)
private Department department;
}
有
CriteriaQuery<Employee> criteriaQuery = criteriaBuilder.createQuery(Employee.class);
Root<Employee> root = criteriqQuery.from(Employee.class);
TypedQuery<Employee> typedQuery = entityManager.createQuery(criteriaQuery);
List<Employee> employees = typedQuery.getResultList();
我希望单个查询同时获取 Employee 及其 Department,类似于
select ... from Employee join Department on ...
相反,我首先选择所有 N Employees,然后选择 N SELECTs 用于所有 Departments(考虑没有缓存)。
我发现了许多类似的问题,但他们的回答提出了解决方法,并没有解释为什么会发生这种情况。请避免建议使用延迟加载的答案:这不是我要的。
【问题讨论】:
标签: java hibernate jpa optimization