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 "expression de constructeur".
Exemple 12.11. Exemple d'instanciation dynamique - Constructeur
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 - Liste
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
select new map( mother as mother, offspr as offspr, mate as mate )
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr
select new map( max(c.bodyWeight) as max, min(c.bodyWeight) as min, count(*) as n )
from Cat cxt"/>
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.