17

子コレクション内のオブジェクトを含むオブジェクトを選択する HQL クエリを作成しようとしています。

例:

コンテスト対象

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

国オブジェクト

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

また

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) 

Countryにも参加を考えていますが、関係を表すオブジェクトクラスがないため、HQLに参加する方法がわかりませんでした。

アイデアや提案はありますか?これは簡単なはずです。

4

2 に答える 2

7

前のものは機能します(少なくとも私にとっては機能します---私は休止状態を使用しています)が、「適切な方法」は「演算子」の「メンバー」です...次のようになります。

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を参照)

elements()はHQL拡張機能だと思います。可能な限り標準(JPQL)を使用する方が良いと思います。

于 2012-08-01T15:05:45.093 に答える