我想知道如何强制JPA创建内连接选择而不是N + 1查询。我有一个泛型 DAO使用JPA标准API,如(简化):
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<T> pageQuery = cb.createQuery(genericType);
Root<T> root = pageQuery.from(genericType);
pageQuery.select(root);
TypedQuery<T> selectQuery = entityManager.createQuery(pageQuery);
selectQuery.setFirstResult(0).setMaxResults(20);
selectQuery.getResultList();
具有JPA / Hibernate注释的域实体可以包含其他实体,例如:
@ManyToOne(fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name = "arematcd")
public Matcode getMatcode() {
return this.matcode;
}
我是否需要为所有当前类型的FK明确调用root.fetch("propertyNameOfReferencedEntity");
?
修改
基于Ish建议的解决方法(只需用Hibernate替换JPA):
Session ss = entityManager.getSession();
Criteria pageQuery = ss.createCriteria(genericType);
pageQuery.setFirstResult(0).setMaxResults(20);
pageQuery.list();
在optional=false
中设置@ManyToOne
没有帮助。
答案 0 :(得分:0)
由于您使用JPA特定的方式构建Criteria查询,因此可能会忽略Hibernate特定的注释,例如@Fetch(FetchMode.JOIN)
。因此,我建议使用特定于Hibernate的Criteria API构建查询。
目前,JPA并不支持像Hibernate那样的特定类型的提取策略。 JPA只有LAZY和EAGER fetch。