2009-02-26 6 views
12

Estoy tratando de escribir una consulta HQL para seleccionar objetos que contienen un objeto en una colección secundaria.HQL Equivalente de SQL Contiene

Ejemplo:

concurso Objeto

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

objeto País

CountryCode 
CountryName 

El SQL equivalente de lo que quiero:

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

O

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) 

tengo este HQL, que funciona, pero parece como no es una buena Solución

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

también considerar unirse con el País, pero ya que no tienen un objeto clase para representar la relación, no estaba seguro de cómo unirme a HQL.

¿Alguien tiene alguna idea o sugerencia? Esto debería ser fácil.

Respuesta

27

probar esto:

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

Related article

+0

Exactamente lo que necesitaba, crea una declaración IN en SQL – Brian

5

la anterior funcionará (al menos a mí me funciona --- estoy usando Hibernate), pero la 'forma correcta' es la " miembro de' operador ... como esto:

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

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

Los elementos() son extensiones HQL, creo. Creo que es mejor usar el estándar (JPQL) siempre que sea posible.

Cuestiones relacionadas