Red Hat Training
A Red Hat training course is available for Red Hat JBoss Web Server
8.3. 関係と結合
また、
join
を使用して関連するエンティティ、または値のコレクションのエレメントにもエイリアスを割り当てることができます。
select cat, mate, kitten from Cat as cat inner join cat.mate as mate left outer join cat.kittens as kitten
select cat from Cat as cat left join cat.mate.kittens as kittens
サポートされた結合タイプは ANSI SQL のものを使用しています。
inner join
left outer join
inner join
、left outer join
コンストラクトは短縮できます。
select cat, mate, kitten from Cat as cat join cat.mate as mate left join cat.kittens as kitten
また、"フェッチ (fetch)" 結合では、単一選択を使用して値の関係またはコレクションを親オブジェクトとともに初期化できます。これは、コレクションの場合に特に役に立ち、関係およびコレクションマッピングメタデータのフェッチオプションよりも優先されます。詳細については、Hibernate リファレンスガイドのパフォーマンスに関する章を参照してください。
select cat from Cat as cat inner join fetch cat.mate left join fetch cat.kittens
関連するオブジェクトを
where
句 (または他の任意の句) で使用すべきでないため、フェッチ結合は通常エイリアスを割り当てる必要はありません。また、関連するオブジェクトはクエリ結果で直接返されません。代わりに、これらのオブジェクトは親オブジェクトを介してアクセスできます。エイリアスが必要となる可能性がある唯一のケースは、別のコレクションを再帰的にフェッチ結合する場合です。
select cat from Cat as cat inner join fetch cat.mate left join fetch cat.kittens child left join fetch child.kittens
fetch
コンストラクトは scroll()
または iterate()
を使用して呼び出されたクエリで使用できないことに注意してください。また、fetch
は setMaxResults()
または setFirstResult()
とともに使用しないでください。クエリ内の複数のコレクションをフェッチ結合することにより直積集合を作成できます。この集合の結果は予期したものよりも大きくないことに注意してください。複数のコレクションロールをフェッチ結合すると、バッグマッピングに対して予期しない結果がもたらされることがあります。したがって、この場合はクエリをどのように構築するかについて注意してください。
プロパティレベルのレイジーフェッチ (バイトコード計測) を使用する場合は、
fetch all properties
を使用して Hibernate で強制的にレイジープロパティをすぐに (最初のクエリで) フェッチできます。
select doc from Document doc fetch all properties order by doc.name
select doc from Document doc fetch all properties where lower(doc.name) like '%cats%'