Hibernate Fetch Join仍然触发选择

时间:2015-08-05 15:05:09

标签: java oracle hibernate jpa persistence

我有一个带有Child OneToOne关系的Hibernate Parent对象:

@OneToOne
@Fetch(FetchMode.JOIN)
@NotFound(action=NotFoundAction.IGNORE)
@JoinColumns({
    @JoinColumn(name="column_a", referencedColumnName="column_a", insertable = false, updatable = false),
    @JoinColumn(name="column_b", referencedColumnName="column_b", insertable = false, updatable = false),
    @JoinColumn(name="column_c", referencedColumnName="column_c", insertable = false, updatable = false)
   })
   public Child getChild()
   {
      return child;
   }

儿童信息可能并不总是可用。我希望始终返回Parent对象,并且如果相关信息可用,则初始化Child对象。

我尝试使用以下HQL来检索父对象列表:

String queryString = "select parent from Parent parent"
                  + " left join fetch parent.child child "
                  + " where parent <.... meets criteria> "
EntityManager em = getEntityManager();
Query query = em.createQuery(queryString);
query.setParameter(<set parameters...>);
query.getResultList();

当我查看这个HQL生成的SQL时,它会在原始SELECT之后为每个Child执行单独的SELECT。

有人能指出我为什么会发生这种情况,将FetchMode设置为JOIN并在HQL查询中明确设置左连接提取?

1 个答案:

答案 0 :(得分:0)

您的孩子班级是否也有一些关联? 请参阅以下可能对您有用的链接。

Avoiding n+1 eager fetching of child collection element association