2009-02-26 34 views
12

Tôi đang cố gắng viết truy vấn HQL để chọn các đối tượng chứa đối tượng trong bộ sưu tập con.HQL Tương đương với SQL chứa

Ví dụ:

thi Object

ContestID 
ContestName 
RequiredCountries -> one to many collection of Country objects 

Object Nước

CountryCode 
CountryName 

Các sql tương đương với những gì tôi muốn:

SELECT * FROM CONTEST C 
WHERE C.CONTESTID IN(SELECT CONTESTID FROM CONTEST_COUNTRY CC INNER JOIN COUNTRY CTRY ON 
CC.COUNTRYCODE = CTRY.COUNTRYCODE WHERE COUNTRYCODE='USA') 

HOẶC

SELECT * FROM CONTEST C 
WHERE EXISTS(SELECT CONTESTID FROM CONTEST_COUNTRY CC INNER JOIN COUNTRY CTRY ON 
CC.COUNTRYCODE = CTRY.COUNTRYCODE WHERE COUNTRYCODE='USA' AND CC.CONTESTID=C.CONTESTID) 

Tôi có HQL này, mà làm việc, nhưng có vẻ như không phải là một tốt solution-

from Contest C 
where (from Country where CountryCode = :CountryCode) = some elements(C.RequiredCountries) 

Tôi cũng xem xét tham gia với quốc gia, nhưng vì tôi không có một đối tượng lớp để đại diện cho mối quan hệ, tôi đã không chắc chắn làm thế nào để tham gia vào HQL.

Bất kỳ ai có bất kỳ ý tưởng hoặc đề xuất nào? Điều này phải dễ dàng.

Trả lời

27

thử điều này:

from Contest Ct, Country Cr 
where Cr.CountryCode = :CountryCode 
    and Cr.Country in elements(Ct.RequiredCountries) 

Related article

+0

Chính xác những gì tôi cần, tạo câu lệnh IN trong SQL – Brian

5

Người trước sẽ làm việc (ít nhất là nó làm việc cho tôi --- Tôi đang sử dụng hibernate), nhưng 'cách thích hợp' là ' thành viên của' nhà điều hành ... như thế này:

select ... 
from Contest Ct, Country Cr 
where Cr.CountryCode = :CountryCode 
    and Cr.Country member of Ct.RequiredCountries 

(thấy http://docs.oracle.com/javaee/6/tutorial/doc/bnbuf.html#bnbvk)

Các phần tử() là phần mở rộng HQL, tôi nghĩ vậy. Tôi nghĩ tốt hơn nên sử dụng tiêu chuẩn (JPQL) bất cứ khi nào có thể.

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