2011-08-24 37 views
10

Estoy intentando crear una Unión entre dos tablas, usando HQL (Hibernate Query Language). Esta secuencia de comandos SQL funciona bien en mi servidor SQL:¿Cómo hacer una declaración Union SQL en HQL?

SELECT COUNT(DISTINCT linkedin_id) as test, school_name 
FROM 
(SELECT * FROM alum_education 
UNION 
SELECT * FROM alum_connection_educations) AS UNIONS where school_name='some string' 

El problema es que cuando intento ejecutarlo en griales como esto:

 def countOfEdu = AlumEducation.executeQuery("select count (distinct linkedinId) as countOfEdu, schoolName as SchoolName from (SELECT * FROM alumEducation UNION SELECT * FROM alumConnectionEducations) AS UNIONS where schoolName='some string'") 

me sale este error:

org.hibernate.hql.ast.QuerySyntaxException: unexpected token: (near line 1, column 83 [select count(distinct linkedinId) as countOfEdu, schoolName as SchoolName from (SELECT * FROM alumEducation UNION SELECT * FROM alumConnectionEducations) AS UNIONS where schoolName='Duquesne University'] 

¿Cómo puedo ejecutar la declaración SQL anterior en griales?

gracias Jason

+3

duplicado posible: http://stackoverflow.com/questions/201023/hibernate-union-alternatives –

+0

eliminado Comentario – jellobird

Respuesta

37

Los sindicatos no son compatibles con HQL. Hay un issue en JIRA de Hibernate que está abierto desde 2005.

+0

Pero se duplica por "** [HHH-3971] (https://hibernate.atlassian.net/browse/HHH-3971) Uso de la funcionalidad UNION ALL, INTERSECTION en hibernación ** ", y se cerró –

0

En su caso, el problema real es que las subconsultas no son compatibles con la cláusula FROM en EJBQL.

0

Me gustaría compartir una forma que he encontrado para evitar esta situación. La única regla aquí es tener el mismo tipo, en este caso una cadena, que corresponde al tipo de la lista de regreso, se podría añadir tantas tablas como desee:

public List<String> findByCPForCNPJ(String query){ 
TypedQuery<String> ccpf = manager.createQuery("select cpf from PessoaFisica where cpf like :pCpf", String.class); 
ccpf.setParameter("pCpf", "%" + query + "%"); 
List<String> lista1 = ccpf.getResultList(); 

TypedQuery<String> ccnpj = manager.createQuery("select cnpj from PessoaJuridica where cnpj like :pCnpj", String.class); 
ccnpj.setParameter("pCnpj", "%" + query + "%"); 

lista1.addAll(ccnpj.getResultList()); 
return lista1; 
} 

he usado un método en Java para esta solución. espero haber contribuido un poco, buena suerte a todos ...

Cuestiones relacionadas