2011-02-03 22 views
11

Estoy creando una consulta en una tabla genérica "Muestra" y tengo varios tipos que heredan de esta tabla "SampleOne", "SampleTwo". requiero una consulta como:Java/JPA | Consulta con el tipo heredado especificado

select s from Sample where s.type = :type 

donde tipo sería un valor discriminador de la tabla. ¿Es posible de alguna manera (y evitar crear una entidad consultas específicas, una para cada SampleOne, SampleTwo ... etc)

Les agradecería mucho cualquier entrada en este tema,

Saludos cordiales, P .

Respuesta

15

En JPA 2.0 se puede utilizar TYPE expresión (aunque en la actualidad no funciona con los parámetros de hibernación, consulte HHH-5282):

select s from Sample s where TYPE(s) = :type 

La expresión similar-Hibernate es específica .class:

select s from Sample s where s.class = :type 
+0

este momento para comenzar una nueva discusión sobre el tema, pero funciona si doy una clase abstracta como: tipo? –

+0

Según https://hibernate.atlassian.net/browse/HHH-4881 esto se ha solucionado en Hibernate 4.0.0.CR5 –

3

Aquí está la relevant section of the Java EE 6 tutorial:

entidades abstractas

Una clase abstracta se puede declarar una entidad por decorando la clase con @Entity. Las entidades abstractas son como entidades concretas pero no se pueden crear instancias.

Se pueden consultar entidades abstractas solo como entidades concretas. Si un entidad abstracta es el blanco de una consulta, la consulta opera en todos los concretos subclases de la entidad abstracta:

@Entity 
public abstract class Employee { 
    @Id 
    protected Integer employeeId; 
    ... 
} 
@Entity 
public class FullTimeEmployee extends Employee { 
    protected Integer salary; 
    ... 
} 
@Entity 
public class PartTimeEmployee extends Employee { 
    protected Float hourlyWage; 
} 

Si leo este derecho, su consulta:

select s from Sample where s.type = :type 

Solo debería devolver elementos del subtipo especificado si type es la columna de discriminador, por lo que lo único que le queda por hacer es enviar la lista de resultados al tipo de sub solicitado.

1

Todavía debe tener cuidado en Hibernate 4.3.7, porque todavía hay un problema con la implementación de TYPE(), por ejemplo:

from SpoForeignPilot sfp where TYPE(sfp.partDocument) = :type 

Esta consulta no funciona, ya que comprueba incorrectamente el tipo de SpoForeignPilot y no el tipo de documento.

Puede solucionar este problema al hacer algo como esto:

select sfp from SpoForeignPilot sfp join sfp.partDocument doc where TYPE(doc) = :type 
+0

Esto no agrega nada nuevo a una pregunta de cinco años. – meskobalazs

+2

Solo quería advertir a las personas que desean usar la solución propuesta (usar TYPE en jpa 2) a consultas más complejas, todavía hay un problema (encontré este problema cuando uso la solución en este hilo). Tiene razón, la consulta en la pregunta no expone este problema. –

+0

@WimDeRammelaere después de horas de rascarse la cabeza, su respuesta me ayudó a encontrar el problema con mi consulta. En pocas palabras, cuando usé ** type ** en una cláusula where trabajó cuando se aplicó a las uniones, pero no pude encontrar ningún resultado cuando se usaba en una expresión de ruta. – Maciek

Cuestiones relacionadas