Hibernate Criteria和多个join
有可能用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;
我有完全相同的问题,并能够像这样解决它:
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"
地指代A
, B
和C
类中的属性名称(类A
具有属性b
,依此类推)。
对于此解决方案,您甚至不需要在A.hbm.xml
设置lazy
和fetch
参数。
Hibernate Reference材料中有一些很好的例子,它们使用setFetchMode来获取与外连接的关联。
一个例子是:
List books = sess.createCriteria(Book.class) .setFetchMode("chapters", FetchMode.EAGER) .setFetchMode("reviews", FetchMode.EAGER) .list();
那里也有关于不同的取物绳索的信息可能对你有用。
尝试在您的条件中设置获取模式,例如:
criteria.setFetchMode(..., FetchMode.EAGER)
这会创建一个连接查询。 您可以在此处找到更多详细信息
是的,实际上有几种方法可以做到这一点:
- 映射关联时,将其lazyness设置为false,并将其获取模式设置为join。 这将影响所有条件查询。
- 使用setFetchMode,如其他答案所详述。
- 使用criteria.createAlias(或createCriteria)。 这也允许您进一步限制要连接的行。