HQL эквивалент SQL содержит

Я пытаюсь написать 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')

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) 

Я также подумываю о присоединении к Country, но поскольку у меня нет класса объекта для представления отношений, я не знал, как присоединиться к HQL.

У кого-нибудь есть идеи или предложения? Это должно быть легко.


person Brian    schedule 26.02.2009    source источник


Ответы (2)


попробуй это:

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

Связанная статья

person Maksym Gontar    schedule 26.02.2009
comment
Именно то, что мне нужно, создает оператор IN в SQL - person Brian; 27.02.2009

Предыдущий будет работать (по крайней мере, у меня он работает - я использую спящий режим), но «правильный способ» - это оператор «член» ... вот так:

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

person ishi    schedule 01.08.2012