On peut aussi assigner des alias à des entités associées, ou même aux éléments d'une collection de valeurs, en utilisant un
join
(jointure).
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
Les types de jointures supportées sont celles de ANSI SQL
inner join
(jointure fermée)
left outer join
(jointure ouverte par la gauche)
right outer join
(jointure ouverte par la droite)
full join
(jointure ouverte totalement - généralement inutile)
Les constructions des jointures inner join
, left outer join
et right outer join
peuvent être abbrégées.
from Cat as cat join cat.mate as mate left join cat.kittens as kitten
Nous pouvons soumettre des conditions de jointure supplémentaires en utilisant le mot-clef HQL with
.
from Cat as cat left join cat.kittens as kitten with kitten.bodyWeight > 10.0
Par ailleurs, une jointure "fetchée" (rapportée) permet d'initialiser les associations ou collections de valeurs en même temps que leur objet parent, le tout n'utilisant qu'un seul Select. Ceci est particulièrement utile dans le cas des collections. Ce système permet de surcharger les déclarations "lazy" et "outer-join" des fichiers de mapping pour les associations et collections. Voir Section 19.1, « Stratégies de chargement » pour plus d'informations.
from Cat as cat inner join fetch cat.mate left join fetch cat.kittens
Une jointure "fetchée" (rapportée) n'a généralement pas besoin de se voir assigner un alias puisque les objets associés n'ont pas à être utilisés dans les autres clauses. Notez aussi que les objets associés ne sont pas retournés directement dans le résultat de la requête mais l'on peut y accéder via l'objet parent. La seule raison pour laquelle nous pourrions avoir besoin d'un alias est si nous récupérions récursivement une collection supplémentaire :
from Cat as cat inner join fetch cat.mate left join fetch cat.kittens child left join fetch child.kittens
Notez que la construction de fetch
ne peut pas être utilisée dans les requêtes appelées par scroll()
ou iterate()
. fetch
ne devrait pas non plus être utilisé avec setMaxResults()
ou setFirstResult()
. fetch
ne peut pas non plus être utilisé avec une condition with
ad hoc. Il est possible de créer un produit cartésien par jointure en récupérant plus d'une collection dans une requête,
donc faites attention dans ce cas. Récupérer par jointure de multiples collections donne aussi parfois des résultats inattendus
pour des mappings de bag, donc soyez prudent lorsque vous formulez vos requêtes dans de tels cas. Finalement, notez que full join fetch
et right join fetch
ne sont pas utiles en général.
Si vous utilisez un chargement retardé pour les propriétés (avec une instrumentation par bytecode), il est possible de forcer
Hibernate à récupérer les propriétés non encore chargées immédiatement (dans la première requête) en utilisant fetch all properties
.
from Document fetch all properties order by name
from Document doc fetch all properties where lower(doc.name) like '%cats%'