2013-03-21 28 views
7

Tôi đang cố gắng viết truy vấn JPQL để trả về các thực thể mà tất cả các thực thể đó có một thuộc tính nằm trong tập các giá trị. Nó tương tự như những câu dưới đây, nhưng nơi có nhiều giá trị có thể:Truy vấn JPA - JPQL để chọn cha mẹ có TẤT CẢ trẻ em với một thuộc tính trong một SET giá trị

Hibernate query - How to select those parents that have ALL the children matching a value?

Dưới đây là một ví dụ thực tế chuyển thể từ câu hỏi trên ...

Tôi muốn chọn những người cha có TẤT CẢ con cái của họ là người tóc vàng hay tóc đỏ. Nếu chỉ có một là tóc đen cha không được chọn.

tôi đã cố gắng thích nghi khác nhau của câu trả lời cho câu hỏi trên như ...

select p from parent where all(parent.children.haircolor) IN ('blonde','redhead') 

hoặc

select p from parent where parent.children.haircolor ALL IN ('blonde','redhead') 

Không khá mong đợi những công việc, nhưng cũng đáng thử. Cho đến nay chỉ có một điều HAS đã làm việc ...

select p from parent 
where 0 = (select count(c) from p.children c 
       where c.haircolor NOT IN ('blonde','redhead') 
     ) 

Tôi thực sự không muốn chạy truy vấn đếm cho mỗi hàng, nhưng tôi không thấy cơ chế tốt hơn. Điều này không hoàn toàn làm tôi ngạc nhiên vì tôi không thể nghĩ ra cách nào khác để viết điều này trong SQL đơn giản, nhưng tôi cũng không phải là một guru. Có cách nào hiệu quả hơn để thực hiện việc này không?

Trả lời

3

Bạn cố gắng sử dụng biểu thức đường dẫn JPQL trên những gì trông giống như thuộc tính bộ sưu tập - bạn không thể làm điều đó. Thay vì làm một tham gia như thế này:

SELECT p FROM Parent p JOIN p.children c WHERE c.haircolor IN :hairColorCollection 

Ở trên, Parent được giả định là một thực thể với một bộ sưu tập có giá trị tài sản children trong đó mỗi đơn vị mục tiêu có giá trị duy nhất haircolor tài sản. :hairColorCollection là một tham số cần được đặt thành đối tượng thu thập trước khi thực hiện truy vấn.

+5

Việc bổ sung thông số thu thập đã được lên kế hoạch, nhưng điều này chỉ thực hiện một phép nối bên trong điển hình. Nó sẽ trả về các thực thể trong đó BẤT K of trẻ em nào phù hợp với bộ sưu tập. Vấn đề ở đây là cần TẤT CẢ trẻ em để phù hợp trước khi phụ huynh được trả lại. – nfdavenport

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