2015-10-28 10 views
9

SELECT NEWステートメントをjpqlクエリ(Hibernate)内に複数記述する方法はありますか?複数のSELECT NEWステートメントを使用したjpaコンストラクタ式

これが私の作品:

@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" 

それとも私のDTOオブジェクトでMapListを使用してItemService

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

の副選択で私も興味が、私は可能なのthatsのない読みますか?そうですか?

2つの例を使用している間、私のSpringブートアプリケーションはエラーで始まります。終わり

私はMap<List<Item>,Map<List<LanguageDTO>,List<ItemServiceDTO>>> map;

+0

JPAプロバイダ(つまり、EclipseLink、Hibernate)とは何ですか? – Ish

+0

申し訳ありませんが、そのHibernate – Patrick

+0

こんにちは。私は新しい演算子を使用しようとしていますが、ほとんどリソースを見つけることはありません。質問:jpa repoインターフェイスを作成して、次のステートメントを配置しますか?public List getAllItemsWithServices();そのレポで?完全な例の例または参照は高く評価されます。ありがとうございました – jscriptor

答えて

11

技術の地図は、JPQL select句の定義によって、それが複数のコンストラクタ表現を可能にするであろう。したいです

  • select_clause :: = SELECT [DISTINCT]のselect_expression {、}のselect_expression *
  • のselect_expression :: = single_valued_pa​​th_expression | aggregate_expression | identification_variable |
    OBJECT(識別変数)| constructor_expression
  • constructor_expression :: = newコンストラクタ名(constructor_item {、constructor_item} *)
  • constructor_item :: = single_valued_pa​​th_expression | aggregate_expression
  • aggregate_expression :: = {AVG |マックス| 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に切り替えると、JPAプロバイダが動作します。したがって、そのようなクエリ構文が許可されている場合は、プロバイダと相談する必要があります。

ただし、NEW演算子を使用する場合、コンストラクタには引数(少なくとも1つ)が必要です。したがって、この式は動作しません:ListMapを使用することが可能であるかどうか、あなたの2番目の質問、オン

SELECT NEW LanguageDTO() 

を、私はあなたのクエリでこれらのコレクションを使用したいだろうか、かなり混乱しています。ただし、JPQL SELECT_CLAUSEの定義に従ってSELECT節にコレクション値のパス式を入れることはできません。

関連する問題