2017-04-21 16 views
1

我々はこのように(例えば)DTOの最終的な結果を予測することができますJPA 2つの基準クエリプロジェクション

query.select(builder.construct(ProductGridDTO.class, 
     root.get(Productos_.proId), 
     root.get(Productos_.proAlias), 
     root.get(Productos_.proNombre), 
     companies.get(Companias_.ciaNombre), 
     companies.get(Companias_.ciaId))); 

しかし、この方法では、私のDTOクラスの引数の順序の依存していますこれは明らかに間違っています。古い(現在廃止されている)休止状態のAPIを使用して、投影リストを使用できます。

ProjectionList projectionList = Projections.projectionList();

projectionList.add(Projections.property("id"), "id"); 
    projectionList.add(Projections.property("name"), "name"); 

DTOのパラメータの順序に依存しない。

JPAでも同様の戦略を使用できますか?

答えて

0

私はQueryDSLに移りました。これはより高いレベルの抽象化を提供し、この投影の問題を解決します。したがって、エンティティをロードしてそのエンティティのDTOを返すクエリは、次のようになります。CompanyDTOにはエンティティのコンストラクタが含まれています。

0

私はそうは思わない、引数の順序はJPAで一致する必要があります。これは、Java 8まで、バイトコードにデバッグ情報が含まれている場合にのみ、パラメータ名が使用可能だったためです。私の推測では、ほとんどのJPAプロバイダはConstructor.newInstance()と呼ばれ、ここで引数は正しく注文されなければなりません。

関連する問題