JPA TABLE_PER_CLASS herencia: ¿Cómo seleccionar solamente las entradas superclase?
-
27-09-2019 - |
Pregunta
Estoy usando EclipseLink como el proveedor JPA. Además estoy usando la siguiente estructura de herencia TABLE_PER_CLASS
@javax.persistence.Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@NamedQueries({
@NamedQuery(name=Parent.QUERY_FIND_ALL, query="SELECT p FROM Parent p")
})
public class Parent {
// the class code follows here
}
@javax.persistence.Entity
@NamedQueries({
@NamedQuery(name=Child.QUERY_FIND_ALL, query="SELECT c FROM Child c")
})
public class Child extends Parent {
// the class code follows here
}
El problema ahora es que sólo quiero recibir las instancias de la clase padre. Pero con la consulta con nombre "SELECT P De padre P" también todas las entradas de la tabla secundaria se devuelven.
El código de seleccionar o encontrar es el siguiente:
public List findWithNamedQuery(String query) {
return em.createNamedQuery(query).getResultList();
}
De este modo consulta es decir, el "SELECT p de los padres p".
¿Cómo puedo recibir solamente realmente las entradas principales y no todas las entradas de esta jerarquía inheritacne?
En pocas palabras: ¿Cómo puedo salir de todas las entradas de niño sin tocar, y devolver sólo las entradas de padres
? EDIT 1:
Estoy usando EclipseLink 2.0.1, pero cada vez que intento solución de axtavt a través de la expresión de tipo, me sale el siguiente error:
"Invalid Type Expression on [my.domain.Parent]. The class does not have a descriptor, or a descriptor that does not use inheritance or uses a ClassExctractor for inheritance".
También he actualizado a la última versión estable 2.1.1 de EclipseLink, pero no resuelve el problema.
Solución 2
La expresión de tipo en combinación con TABLE_PER_CLASS herencia doesn' t trabajo bajo EclipseLink 2.1.1, esto parece ser un error.
Vea también la respuesta a JPA 2.0: Tipo de excepción expresión
Otros consejos
Si su versión de EclipseLink apoya JPA 2.0, puede escribir
SELECT p FROM Parent p WHERE TYPE(p) = Parent