Hibernate JPA注释条件联接

Hibernate JPA注释条件联接,hibernate,jpa,Hibernate,Jpa,我想知道如何强制JPA创建内部连接选择,而不是N+1查询。我有一个通用的DAO,使用JPA标准API,如(简化): 我是否需要显式地调用root.fetch(“propertyNameOfReferencedEntity”)当前类型的所有FK 编辑: 基于Ish建议的解决方案(只需将JPA替换为Hibernate): 在@ManyToOne中设置optional=false没有帮助。由于您使用JPA特定的方式构造条件查询,可能忽略了Hibernate特定的注释,例如@Fetch(FetchMod

我想知道如何强制JPA创建内部连接选择,而不是N+1查询。我有一个通用的DAO,使用JPA标准API,如(简化):

我是否需要显式地调用
root.fetch(“propertyNameOfReferencedEntity”)当前类型的所有FK

编辑:

基于Ish建议的解决方案(只需将JPA替换为Hibernate):


@ManyToOne
中设置
optional=false
没有帮助。

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


目前,JPA不像Hibernate那样支持特定类型的获取策略。JPA只有惰性和急切的获取。

是否使关系不可为空?然后,我希望JPA实现执行内部操作,或者至少DataNucleus JPA执行。不知道“@Fetch”是什么,因为不是JPA@NeilStockton
@Fetch
是org.hibernate.annotations.Fetch似乎没有效果,我尝试将
nullable=false
添加到一个父实体中的所有
@JoinColumn
中,但生成的查询仍然是相同的(尽管我没有更改DB中列的可空类型)我知道您使用了JPA特定的方法来构造条件查询。尝试使用特定于Hibernate的API创建条件查询如何?我不确定这是否会有所不同。也许,它可以阅读此
@Fetch(FetchMode.JOIN)
@Ish刚刚尝试用Hibernate标准替换JPA标准,现在我有了一个select with JOIN,发布一个答案,我将接受它作为解决方法。很高兴它可以作为解决方法。我刚把我的建议贴出来作为答案。谢谢
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();
@ManyToOne(fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name = "arematcd")
public Matcode getMatcode() {
    return this.matcode;
}
Session ss = entityManager.getSession();
Criteria pageQuery = ss.createCriteria(genericType);
pageQuery.setFirstResult(0).setMaxResults(20);      
pageQuery.list();