70

私は最近、JPQL次のようにステートメントで新しいオブジェクトを作成できることを学びました。

select new Family(mother, mate, offspr)
from DomesticCat as mother
    join mother.mate as mate
    left join mother.kittens as offspr

これは避けるべきものですか、それとも受け入れるべきものですか?グッドプラクティスに照らして、この機能の使用が正当化されるのはいつですか?

4

3 に答える 3

136

§10.2.7.2に記載されているように、完全に有効なユースケースがあるため、SELECTNEWがあります。EJB 3.0 JPA仕様のSELECT句のJPQLコンストラクタ式

SELECTリストでコンストラクターを使用して、1つ以上のJavaインスタンスを返すことができます。指定されたクラスは、エンティティである必要はなく、データベースにマップされている必要もありません。コンストラクター名は完全修飾されている必要があります。

SELECT NEW句でエンティティクラス名が指定されている場合、結果のエンティティインスタンスは新しい状態になります。

SELECT NEW com.acme.example.CustomerDetails(c.id, c.status, o.count)
FROM Customer c JOIN c.orders o
WHERE o.count > 100

つまり、(ではなく)タイプセーフな方法でオブジェクトの完全なエンティティまたは完全なグラフを取得したくない場合は、SELECTNEWを使用しますObject[]。クエリの結果をエンティティクラスにマップするか、マップされていないクラスにマップするかは、選択内容によって異なります。典型的な例は、リスト画面です(すべての詳細が必要ない場合があります)。

言い換えれば、どこでも使用しないでください。ただし、使用を禁止しないでください(黒または白だけのものはほとんどありません)。

于 2010-03-01T21:31:33.697 に答える
31

データ転送オブジェクトを取得する場合は、この種のクエリをよく使用します。たぶん、レポートはそれを使用するのに良い場所かもしれません。(代わりにFamilyからのように)単一のドメインオブジェクトを取得したいだけの場合は、それを使用する理由はありません。

于 2010-03-01T16:22:20.883 に答える
7

newで作成されたオブジェクトは、DTOである必要はありません。つまり、ビジネスレイヤーによってエクスポートされるオブジェクトです。また、POJOドメインオブジェクト、つまりビジネスレイヤーによって内部的に使用されるオブジェクトにすることもできます。

この種類のPOJOを完全なJPAエンティティではなく部分的なオブジェクトとして使用する理由は、特定の種類のJOINSでのパフォーマンスです。これを説明する優れたリソースは次のとおりです。http://use-the-index-luke.com/sql/join/hash-join-partial-objects

于 2015-04-04T09:34:08.020 に答える