2009-02-26 5 views
12

Я пытаюсь написать запрос HQL для выбора объектов, содержащих объект в дочерней коллекции.HQL Эквивалент SQL содержит

Пример:

Конкурс Объект

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) 

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

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

ответ

27

попробовать это:

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

Related article

+0

Точно то, что мне нужно, создает инструкцию IN в SQL – Brian

5

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

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), когда это возможно.