2009-02-26 83 views
12

我試圖編寫一個HQL查詢來選擇包含子集合中的對象的對象。SQL的HQL等價物包含

例子:

競賽對象

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

Country對象

CountryCode 
CountryName 

的SQL相當於我想要什麼:

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') 

OR

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) 

我有這個的HQL,它的工作原理,但似乎不是一個很好的解決方案 -

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

我也考慮與國家加入,但因爲我沒有對象類來表示關係,我不確定如何加入HQL。

任何人有任何想法或建議?這應該很容易。

回答

27

試試這個:

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

Related article

+0

正是我所需要的,在SQL中創建一個IN語句 – Brian 2009-02-26 21:52:05

5

前一個會工作(至少它爲我的作品---我使用Hibernate),但「適當的方式」是「 「運營商......像這樣的成員:

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

(見http://docs.oracle.com/javaee/6/tutorial/doc/bnbuf.html#bnbvk

我認爲元素()是HQL擴展。我認爲儘可能使用標準(JPQL)會更好。