14.3. 関連と結合

関連するエンティティあるいは値コレクションの要素にも、join を使って別名を割り当てることが出来ます。例えば、
from Cat as cat
    inner join cat.mate as mate
    left outer join cat.kittens as kitten
from Cat as cat left join cat.mate.kittens as kittens
from Formula form full join form.parameter param
サポートしている結合のタイプは ANSI SQL から採っています:
  • inner join
  • left outer join
  • right outer join
  • full join (たいていの場合使いづらい)
inner joinleft outer joinright outer join には省略形を使うこともできます。
from Cat as cat
    join cat.mate as mate
    left join cat.kittens as kitten
HQL の with キーワードを使うと、結合条件を付け加えることができます。
from Cat as cat
    left join cat.kittens as kitten
        with kitten.bodyWeight > 10.0
「フェッチ」結合は関連や値のコレクションを親オブジェクトと一緒に1度の select で初期化します。これは特にコレクションの場合に有用です。また、効果的に関連とコレクションに対し、マッピングファイルの外部結合や遅延宣言をオーバーライドします。詳細は 「フェッチ戦略」 を参照してください。
from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens
関連オブジェクトを where 節 (または他のどんな節でも) で使うべきではないため、フェッチ結合には通常別名を割り当てる必要がありません。また関連オブジェクトはクエリ結果として直接返されません。代わりに親オブジェクトからアクセスできます。別名が必要となる唯一の理由として、さらにコレクションを再帰的に結合フェッチする場合というのが挙げられます:
from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens child
    left join fetch child.kittens

重要

fetch 構文は iterate() を使ったクエリ呼び出しで使用できません(一方で scroll() は使用できます)。また、これらの操作は結果の行に基づいているため、 fetchsetMaxResults()setFirstResult() と一緒に使用する必要があります。通常 即時コレクションフェッチをすると重複が出てしまうため、期待するような行数にはならないのです。そしてまた fetch は、アドホックな with 条件を一緒に使うこともできません。一つのクエリで複数のコレクションを結合フェッチすることにより直積集合を作成できるので、この場合注意してくださいuまた、複数のコレクションに対する結合フェッチは bag マッピングに対して予期せぬ結果をもたらすことがあるので、この場合のクエリの作成には注意してください。最後に 全外部結合によるフェッチ右外部結合によるフェッチ は意味がない点に注意してください。
プロパティレベルの遅延フェッチを使う場合(バイトコード処理をする場合)、fetch all properties を使うことで Hibernate に遅延プロパティを速やかに最初のクエリでフェッチさせることができます。
from Document fetch all properties order by name
from Document doc fetch all properties where lower(doc.name) like '%cats%'