2015-10-28 23 views
9

Có cách nào để có nhiều câu lệnh SELECT NEW trong truy vấn jpql (Hibernate) không?Biểu thức hàm tạo hàm băm với nhiều câu lệnh SELECT mới

này làm việc cho tôi:

@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(); 

tôi nhận được kết quả mong đợi trong DTO tôi.

@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; 
    } 

Nhưng những gì tôi muốn là phải có một thể hiện mới của Language với contructor của nó.

Ví dụ như thế này:

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

Hoặc trong một subselect của ItemService

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

Tôi cũng quan tâm đến việc sử dụng MapList trong đối tượng DTO của tôi, nhưng tôi đọc thats không thể? Có đúng không?

Ứng dụng khởi động mùa xuân của tôi bắt đầu có lỗi khi sử dụng hai ví dụ.

Cuối cùng tôi muốn một bản đồ của Map<List<Item>,Map<List<LanguageDTO>,List<ItemServiceDTO>>> map;

+0

Nhà cung cấp JPA của bạn (tức là EclipseLink, Hibernate) là gì? – Ish

+0

Xin lỗi, Hibernate – Patrick

+0

của tôi xin chào. Tôi đang cố gắng sử dụng toán tử mới nhưng tìm kiếm ít tài nguyên. câu hỏi: bạn có tạo giao diện repo jpa không và đặt câu lệnh này: public list getAllItemsWithServices(); trong đó repo? Một ví dụ hoặc tham chiếu đến một ví dụ hoàn chỉnh sẽ được đánh giá cao. Cảm ơn bạn – jscriptor

Trả lời

11

Về mặt kỹ thuật, theo định nghĩa của chọn khoản JPQL, nó sẽ cho phép nhiều biểu thức constructor.

  • select_clause :: = CHỌN [DISTINCT] select_expression {, select_expression} *
  • select_expression :: = single_valued_path_expression | aggregate_expression | ident_variable |
    OBJECT (ident_variable) | constructor_expression
  • constructor_expression :: = NEW constructor_name (constructor_item {, constructor_item} *)
  • constructor_item :: = single_valued_path_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)

Ví dụ:

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

Tuy nhiên, tôi chỉ phát hiện ra rằng Hibernate không cho phép nó. Khi tôi chuyển nhà cung cấp JPA từ Hibernate sang EclipseLink, nó hoạt động. Vì vậy, bạn có thể cần tham khảo ý kiến ​​của nhà cung cấp nếu cú ​​pháp truy vấn đó được cho phép.

Lưu ý rằng, khi sử dụng toán tử MỚI, hàm tạo của bạn phải có đối số (ít nhất một).Vì vậy, biểu thức này sẽ không làm việc:

SELECT NEW LanguageDTO() 

Về câu hỏi thứ hai của bạn, cho dù đó có thể sử dụng ListMap, tôi khá bối rối như thế nào bạn muốn sử dụng những bộ sưu tập trong truy vấn của bạn. Tuy nhiên, hãy lưu ý rằng không thể có các biểu thức đường dẫn có giá trị thu thập trong mệnh đề SELECT của bạn theo định nghĩa của quy tắc viết tay JPQL.

Các vấn đề liên quan