web-dev-qa-db-ja.com

複数のSELECTNEWステートメントを含むjpaコンストラクター式

jpqlクエリに複数のSELECT NEWステートメントを含める方法はありますか(Hibernate)?

これは私のために働きます:

@Query("SELECT NEW com.test.project.dto.ItemService(g,s,l,r) "
        +" FROM Item g, Service s, Service l , Service r"
        +" WHERE s.id = g.id" 
        +" AND s.location = l.name"
        +" AND s.serviceType = 'type'"
        +" AND l.serviceType = 'Location'"
        +" AND l.area = r.name" 
        +" AND r.serviceType = 'Region'")
public List<Item> getAllItemsWithServices();

DTOで期待どおりの結果が得られます。

@Component
public class ItemServiceDTO{

    private Item item;
    private Service serviceType;
    private Service serviceLocation;
    private Service serviceRegion;

    public ItemServiceDTO(item item, Service serviceType, Service serviceLocation, Service serviceRegion) {
        super();
        this.item = item;
        this.serviceType = serviceType;
        this.serviceLocation = serviceLocation;
        this.serviceRegion = serviceRegion;
    }

しかし、私が欲しいのは、そのコンストラクターでLanguageの新しいインスタンスを作成することです。

たとえば、次のようになります。

 @Query("SELECT NEW com.test.project.dto.ItemService(g,s,l,r), new LanguageDTO()"
            +" FROM Item g, Service s, Service l , Service r"

またはItemServiceの副選択で

 @Query("SELECT NEW com.test.project.dto.ItemService(g,s,l,r, new LanguageDTO())"
                +" FROM Item g, Service s, Service l , Service r"

DTOオブジェクトでMapListを使用することにも興味がありますが、それは不可能ですか?そうですか?

2つの例を使用しているときに、Springブートアプリケーションがエラーで起動します。

最後にMap<List<Item>,Map<List<LanguageDTO>,List<ItemServiceDTO>>> map;の地図が欲しい

11
Patrick

技術的には、JPQL select句の定義により、複数のコンストラクタ式が許可されます。

  • select_clause :: = SELECT [DISTINCT] select_expression {、select_expression} *
  • select_expression :: = single_valued_pa​​th_expression |集計式|識別変数​​|
    OBJECT(identification_variable)|コンストラクター式
  • コンストラクター式:: = NEWコンストラクター名(コンストラクターアイテム{、コンストラクターアイテム} *)
  • コンストラクターアイテム:: = single_valued_pa​​th_expression | Aggregate_expression
  • aggregate_expression :: = {AVG | MAX | MIN | SUM}([DISTINCT] state_field_path_expression)| COUNT([DISTINCT]
    identification_variable | state_field_path_expression |
    single_valued_association_path_expression)

例:

SELECT NEW com.test.model.UserName(u.firstname, u.lastname), NEW com.test.model.UserEmail(u.email) FROM User u

しかし、Hibernateがそれを許可していないことを発見しました。 JPAプロバイダーをHibernateからEclipseLinkに切り替えると、機能します。したがって、そのようなクエリ構文が許可されている場合は、プロバイダーに相談する必要があります。

ただし、NEW演算子を使用する場合、コンストラクターには引数(少なくとも1つ)が必要であることに注意してください。したがって、この式は機能しません。

SELECT NEW LanguageDTO()

2番目の質問であるListMapを使用できるかどうかについて、クエリでこれらのコレクションをどのように使用するかについてはかなり混乱しています。ただし、JPQL SELECT_CLAUSEの定義に従って、SELECT句にコレクション値のパス式を含めることはできないことに注意してください。

14
Ish