Ho una classe di entità e di una sottoclasse basata su tale entità:JPA nativo di query per entità con l'ereditarietà
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class A
e
@Entity
public class B extends A
Ho bisogno di emettere una query nativo che utilizza una stored procedure solo sulla classe base (A). Se tento come segue:
entityManager.createNativeQuery("select * from A a where procedure(f)",A.class).getResultList()
ottengo un errore "Il clazz_ colonna non è stato trovato nel ResultSet". Presumo che il provider JPA aggiunga questa colonna per discriminare tra la classe base e la classe estesa. Posso aggirare il problema aggiungendo esplicitamente la colonna Clazz e tutti i campi dalla sottoclasse:
entityManager.createNativeQuery("select *,1 as clazz_,null as prop1,null as prop2 from A a where procedure(f)",A.class).getResultList()
dove "prop1" e "prop2" sono proprietà della sottoclasse B. Tuttavia, questo sembra un inutile hack ed è soggetto a problemi di manutenzione se la sottoclasse B cambia.
La mia domanda è: come posso interrogare usando una stored procedure su un'entità che ha ereditato su di essa?
Così, avevo pensato a questo, ma il problema è che quando Hibernate tenta di gonfiare l'oggetto dai risultati et row, trova due colonne id, una delle quali è null. Suppongo di poter aggiungere un'ulteriore clausola where che filtri 'b.id è null'. – AnthonyF
La domanda è: quando la scriviamo in questo modo, otterremmo sempre istanze di classe B? –