Hibernate中left join,right join等用法的详解

inner join(内连接)
left outer join(左外连接)
right outer join(右外连接)
full join (全连接,并不常用)

语句inner join, left outer join 以及 right outer join 可以简写。
简写的方法可以参考:from Dog  as dog   join dog.mate as mate    left join dog.kittens as kitten

通过HQL的with关键字,你可以提供额外的join条件。例如:from Dog  as dog left join dog.kittens as kitten with kitten.bodyWeight > 10.0

还有,一个”fetch”连接允许仅仅使用一个选择语句就将相关联的对象或一组值的集合随着他们的父对象的初始化而被初始化,这种方法在使用到集合的情况下尤其有用,对于关联和集合来说,它有效的代替了映射文件中的外联接 与延迟声明(lazy declarations).如:from Dog as dog inner join fetch dog.mate left join fetch dog.kittens

一个fetch连接通常不需要被指定别名, 因为相关联的对象不应当被用在 where 子句 (或其它任何子句)中。同时,相关联的对象 并不在查询的结果中直接返回,但可以通过他们的父对象来访问到他们。如:from Dog as dog inner join fetch dog.mate left join fetch dog.kittens child left join fetch child.kittens

假若使用iterate()(迭代器)来调用查询,请注意fetch构造是不能使用的(scroll() 可以使用)。fetch也不应该与setMaxResults() 或setFirstResult()共用,这是因为这些操作是基于结果集的,而在预先抓取集合类时可能包含重复的数据,也就是说无法预先知道精确的行数。fetch还不能与独立的 with条件一起使用。通过在一次查询中fetch多个集合,可以制造出笛卡尔积,因此请多加注意。对bag映射来说,同时join fetch多个集合角色可能在某些情况下给出并非预期的结果,也请小心。最后注意,使用full join fetch 与 right join fetch是没有意义的。

如果你使用属性级别的延迟获取(lazy fetching)(这是通过重新编写字节码实现的),可以使用 fetch all properties 来强制Hibernate立即取得那些原本需要延迟加载的属性(在第一个查询中)。
例如:
from DocFile fetch all properties order by name
from DocFile df fetch all properties where lower(df.name) like ”%dogs%”

你可能感兴趣的:(Hibernate)