JPA注释标准加入

时间:2015-10-20 16:03:46

标签: hibernate jpa

我想知道如何强制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没有帮助。

1 个答案:

答案 0 :(得分:0)

由于您使用JPA特定的方式构建Criteria查询,因此可能会忽略Hibernate特定的注释,例如@Fetch(FetchMode.JOIN)。因此,我建议使用特定于Hibernate的Criteria API构建查询。

目前,JPA并不支持像Hibernate那样的特定类型的提取策略。 JPA只有LAZY和EAGER fetch。