Ответ 1
попробуйте следующее:
from Contest Ct, Country Cr
where Cr.CountryCode = :CountryCode
and Cr.Country in elements(Ct.RequiredCountries)
Я пытаюсь написать запрос 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)
Я также рассматриваю присоединение к стране, но поскольку у меня нет объектного класса для представления отношения, я не был уверен, как присоединиться к HQL.
У кого-нибудь есть идеи или предложения? Это должно быть легко.
попробуйте следующее:
from Contest Ct, Country Cr
where Cr.CountryCode = :CountryCode
and Cr.Country in elements(Ct.RequiredCountries)
Предыдущий будет работать (по крайней мере, он работает для меня --- я использую спящий режим), но "правильный путь" - это "член" оператора... например:
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), когда это возможно.