12.4.12. Instanciation dynamique
Il y a un type d'expression particulier qui n'est valide que dans la clause Select. Hibernate nomme cela une "dynamic instanciation". JPQL supporte cette fonctionnalité et nomme cela une "constructor expression".
Exemple 12.11. Exemple d'instanciation dynamique - Constructor
select new Family( mother, mate, offspr )
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
select new Family( mother, mate, offspr )
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
Au lieu de s'affairer avec l'Object[], nous englobons ici les valeurs dans un objet java de type-safe qui sera retourné en tant que résultat de la demande. La référence de la classe doit être totalement qualifiée et doit avoir un constructeur correspondant.
La classe doit ici être mappée. Si elle représente une entité, les instances résultantes devront être renvoyées dans un état NEW (non géré!).
C'est la partie que JPQL prend en charge également. HQL prend en charge des fonctionnalités en "dynamic instantiation" supplémentaires. Tout d'abord, la recherche peut spécifier de renvoyer une Liste à la place d'un Object[] pour les résultats scalaires :
Exemple 12.12. Exemple d'instanciation dynamique - List
select new list(mother, offspr, mate.name)
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr
select new list(mother, offspr, mate.name)
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr
Les résultats de cette recherche correspondront à List<List> et non pas à List<Object[]>
HQL supporte également l'absorption de résultats scalaires dans une Mappe.
Exemple 12.13. Exemple d'instanciation dynamique - Mappe
Les résultats de cette recherche correspondront à List<Map<String,Object>> et non pas à List<Object[]>. Les clés de la mappe sont définies par les alias donnés aux expressions Select.