JPQL Select ステートメントで新しいオブジェクトを作成 - 避けるか受け入れるか?
質問
最近、新しいオブジェクトを作成できることを知りました。 JPQL
次のようなステートメント:
select new Family(mother, mate, offspr)
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
これは避けるべきものなのでしょうか、それともむしろ受け入れるべきものなのでしょうか?適切な実践に照らして、この機能の使用が正当化されるのはどのような場合ですか?
解決
避けないでください, で説明したように、SELECT NEW が存在するのは、完全に有効な使用例があるためです。 §10.2.7.2。SELECT 句の JPQL コンストラクター式 の EJB 3.0 JPA仕様:
コンストラクターを選択リストで使用して、1つ以上のJavaインスタンスを返すことができます。指定されたクラスは、エンティティであるか、データベースにマッピングする必要はありません。 コンストラクター名は完全に適格でなければなりません。
選択の新しい節でエンティティクラス名が指定されている場合、結果のエンティティインスタンスは新しい状態にあります。
SELECT NEW com.acme.example.CustomerDetails(c.id, c.status, o.count) FROM Customer c JOIN c.orders o WHERE o.count > 100
つまり、完全なエンティティまたはオブジェクトの完全なグラフを型安全な方法で取得したくない場合は、SELECT NEW を使用します。 Object[]
)。クエリの結果をエンティティ クラスにマップするか、マップされていないクラスにマップするかは、選択内容によって異なります。典型的な例はリスト画面です (詳細をすべて表示する必要はないかもしれません)。
言い換えれば、どこでも使用しないでください。しかし、その使用を禁止しません(白か黒かだけのことはほとんどありません)。
他のヒント
を取得する場合は、この種のクエリをよく使用します。 データ転送オブジェクト. 。おそらくレポートがそれを使用するのに適した場所になるかもしれません。単一のドメイン オブジェクトを取得したいだけの場合 (例: 家族から 代わりに)、それを使用する理由はありません。
newで作成したオブジェクトはDTO、ビジネス層によってエクスポートされる、すなわちオブジェクトである必要はありません。また、すなわち、オブジェクトは、ビジネスレイヤによって内部的に使用、POJOドメインオブジェクトことができます。
ではなく、完全なJPAエンティティの一部のオブジェクトとしてのPOJOのこの種を使用する理由は、JOINSの特定の種類のパフォーマンスです。これを説明する偉大なリソースです:ます。http://使用-the-index-luke.com/sql/join/hash-join-partial-objectsする