2009-02-26 9 views
12

J'essaie d'écrire une requête HQL pour sélectionner des objets qui contiennent un objet dans une collection enfant.HQL Equivalent de SQL contient

Exemple:

concours objet

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

Pays Objet

CountryCode 
CountryName 

L'équivalent sql de ce que je veux:

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

OU

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) 

Je HQL, qui fonctionne, mais semble pas comme un bon Solution-

from Contest C 
where (from Country where CountryCode = :CountryCode) = some elements(C.RequiredCountries) 

Je considère également se joindre à pays, mais étant donné que je ne dispose pas d'un objet classe pour représenter la relation, je ne savais pas comment rejoindre HQL.

Vous avez des idées ou des suggestions? Cela devrait être facile.

Répondre

27

essayez ceci:

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

Related article

+0

Exactement ce dont j'avais besoin, crée une instruction IN dans SQL – Brian

5

Le précédent fonctionnera (au moins ça marche pour moi --- J'utilise veille prolongée), mais la « bonne façon » est le ' membre du » opérateur ... comme ceci:

select ... 
from Contest Ct, Country Cr 
where Cr.CountryCode = :CountryCode 
    and Cr.Country member of Ct.RequiredCountries 

(voir http://docs.oracle.com/javaee/6/tutorial/doc/bnbuf.html#bnbvk)

Les éléments() sont l'extension HQL, je pense. Je pense qu'il est préférable d'utiliser la norme (JPQL) autant que possible.