13.4.12. 動的インスタンス化について
select 句でのみ有効な特定の式タイプがあります。Hibernate では、これを「動的なインスタンス化 (dynamic instantiation)」と呼びます。JPQL はこの機能の一部に対応しており、これを「コンストラクト式 (constructor expression)」と呼びます。
例13.11 動的インスタンス化の例 - コンストラクター
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
ここでは Object[] を扱うのではなく、クエリーの結果として返される型安全な java オブジェクトの値をラップします。クラス参照は完全修飾する必要があり、一致するコンストラクターが必要です。
ここのクラスはマッピングする必要はありません。エンティティーを表す場合、生成されるインスタンスは NEW 状態 (管理されない) で返されます。
これは JPQL もサポートします。HQL は、追加の「動的なインスタンス化」機能に対応しています。まず、クエリーはスカラー結果に対して Object[] ではなく List を返すように指定できます。
例13.12 動的インスタンス化の例 - リスト
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
このクエリーの結果は List<Object[]> ではなく List<List> になります。
HQL は、マップでのスカラー結果のラッピングもサポートします。
例13.13 動的インスタンス化の例 - マップ
このクエリーの結果は List<Object[]> ではなく List<Map<String,Object>> になります。マップのキーは、選択式に対して提供されたエイリアスによって定義されます。