JPA TABLE_PER_CLASS eredità: come selezionare solo le voci superclasse?
-
27-09-2019 - |
Domanda
sto usando EclipseLink come provider JPA. Inoltre sto usando la seguente struttura di ereditarietà 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
}
Il problema ora è che voglio solo ricevere le voci della classe genitore. Ma con la query denominata "SELEZIONE P da Parent p" anche tutte le voci dalla tabella figlio vengono restituiti.
Il codice di selezionare o trovare è la seguente:
public List findWithNamedQuery(String query) {
return em.createNamedQuery(query).getResultList();
}
In tal modo query è cioè il "SELEZIONA p FROM Parent p".
Come posso ricevere veramente solo le voci di madri e non tutte le voci di questa gerarchia inheritacne?
In breve: Come posso lasciare tutti gli elementi figlio intatta, e restituire solo le voci genitori
? Modifica 1:
Sto utilizzando EclipseLink 2.0.1, ma ogni volta che provo soluzione axtavt tramite l'espressione tipo, ho il seguente errore:
"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".
Ho aggiornato anche l'ultima versione stabile 2.1.1 di EclipseLink, ma non risolve il problema.
Soluzione 2
L'espressione tipo in combinazione con TABLE_PER_CLASS eredità doesn' t lavoro sotto EclipseLink 2.1.1, questo sembra essere un bug.
Si veda anche la risposta al JPA 2.0: fa eccezione l'espressione TIPO
Altri suggerimenti
Se la versione di EclipseLink supporta JPA 2.0, è possibile scrivere
SELECT p FROM Parent p WHERE TYPE(p) = Parent