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
ここでは 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
このクエリーの結果は List<Object[]> ではなく List<List> になります。
HQL は、マップでのスカラー結果のラッピングもサポートします。
例13.13 動的インスタンス化の例 - マップ
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
このクエリーの結果は List<Object[]> ではなく List<Map<String,Object>> になります。マップのキーは、選択式に対して提供されたエイリアスによって定義されます。