Hibernate Criteria和多个join

时间:2010-02-12 14:33:34

标签: java hibernate join criteria

可以用Hibernate标准吗?

select A.something, B.something, C.something, D.something
    from  A JOIN B on A.id = B.id_fk
          JOIN C ON B.id = C.id_fk
          JOIN D ON C.id = D.id_fk;

4 个答案:

答案 0 :(得分:17)

我有完全相同的问题,并且能够像这样解决它:

return criteria.createCriteria(A.class)
               .createCriteria("b", "join_between_a_b")
               .createCriteria("c", "join_between_b_c")
               .createCriteria("d", "join_between_c_d")
               .add(Restrictions.eq("some_field_of_D", someValue));

注意:上面代码中的"b""c""d"会引用ABC类中的属性名称,相应地(类A具有属性b,依此类推。)

对于此解决方案,您甚至不需要在lazy中设置fetchA.hbm.xml参数。

答案 1 :(得分:2)

Hibernate Reference material中有一些很好的示例,它们使用setFetchMode来获取与外部联接的关联。

一个例子是:

List books = sess.createCriteria(Book.class)
.setFetchMode("chapters", FetchMode.EAGER)
.setFetchMode("reviews", FetchMode.EAGER)
.list();

还有information there about different fetching stragies可能对您有用。

答案 2 :(得分:1)

尝试在条件中设置提取模式,例如:

criteria.setFetchMode(..., FetchMode.EAGER)

这会创建一个连接查询。 您可以找到更多详细信息here

答案 3 :(得分:0)

是的,实际上有几种方法可以做到这一点:

  1. 映射关联时,将其lazyness设置为false,并将其获取模式设置为join。这将影响所有条件查询。
  2. 使用setFetchMode,详见其他答案。
  3. 使用criteria.createAlias(或createCriteria)。这也允许您进一步限制要加入的行。