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

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

15 голосов
/ 26 февраля 2009

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

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

Ответы [ 2 ]

34 голосов
/ 27 февраля 2009

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

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

Статья по теме

6 голосов
/ 01 августа 2012

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

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

...