2015-10-28 45 views
9

有沒有辦法在jpql查詢(Hibernate)中有多個SELECT NEW語句?有多個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" 

或者在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但我看了那不是可能呢?是對的嗎?

在使用這兩個示例時,我的Spring引導應用程序確實以錯誤啓動。

最後我希望有一個地圖Map<List<Item>,Map<List<LanguageDTO>,List<ItemServiceDTO>>> map;

+0

什麼是您的JPA提供者(即EclipseLink,Hibernate)? – Ish

+0

對不起,其Hibernate – Patrick

+0

hello。我正在嘗試使用新的操作員,但找不到任何資源。問題:你是否創建了一個jpa repo接口並放置這條語句:public List getAllItemsWithServices();在那個回購?一個例子或引用一個完整的例子將不勝感激。謝謝 – jscriptor

回答

11

技術上的,由JPQL選擇條款的定義,這將允許多個構造函數表達式。

  • select_clause :: = SELECT [DISTINCT] select_expression中{,select_expression中} *
  • select_expression中:: = single_valued_pa​​th_expression |聚合表達式| identification_variable |
    OBJECT(identification_variable)| constructor_expression
  • constructor_expression :: = NEW new constructor_name(constructor_item {,constructor_item} *)
  • constructor_item :: = 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運算符時,您的構造函數必須有參數(至少一個)。所以這個表達式將無法正常工作:

SELECT NEW LanguageDTO() 

關於第二個問題,是否可以使用ListMap,我很困惑,你會怎樣想在查詢中使用這些集合。但是,請注意,按照JPQL SELECT_CLAUSE的定義,在SELECT子句中不可能存在集合值路徑表達式。