2012-01-18 13 views
10

que tiene una jerarquía de clases compleja con múltiples niveles de herencia, y tengo que consultar para ciertos tipos específicos dentro de esa jerarquía, utilizando HQL.HQL consulta para múltiples tipos/clases

Digamos que tengo clases gato, perro y mono, con un animal común de la clase base.

¿Cómo escribo una consulta que selecciona solo algunas de esas, por ejemplo, Cat and Dog?

También necesito ordenar o filtrar por ciertas propiedades de Animal, por ejemplo, animales con Sexo = "Hombre" y ordenar por Nombre.

¿Esto es posible?

Respuesta

11

La función estándar de JPQL es TYPE(), que también se admite en Hibernate, como se menciona en su documentation.

Por favor, sigue un ejemplo:

select a from Animal a 
where type(a) in ('Cat', 'Dog') 
    and a.sex = 'Male' 
order by a.name 

Hibernate también utiliza el .class propiedad implícita:

select a from Animal a 
where a.class in ('Cat', 'Dog') 
    and a.sex = 'Male' 
order by a.name 
+0

de acuerdo con la [NH Knol] (http://knol.google.com/k/nhibernate-chapter-12-hql-the-hibernate-query-language) por Fabio Maulo, "la clase de propiedad especial accede al valor discriminador de una instancia en el caso de persistencia polimórfica. Un nombre de clase Java incrustado en la cláusula where ser traducido a su valor discriminador ". - Así que parece que es compatible. Lo probaré mañana por la mañana y publicaré el resultado aquí, ¡gracias! –

+0

¡La propiedad .class mágica funciona muy bien con HQL en NH! Como advertencia, la API de Criteria no es tan útil: necesitaba una solución alternativa, recuperar manualmente el discriminador de la asignación, ya que la API de Criteria no traduce los nombres de clase a valores de discriminador, pero espera que conozca el discriminador. valor por adelantado. Cosas terribles ¡Pero con HQL funciona genial! –

Cuestiones relacionadas