Ho più entità che vengono interrogate tramite la query criteri JPA2.Come recuperare tutti i dati in una query
sono in grado di unire due di queste entità e ottenere il risultato in una sola volta:
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<LadungRgvorschlag> criteriaQuery = criteriaBuilder.createQuery(LadungRgvorschlag.class);
Root<LadungRgvorschlag> from = criteriaQuery.from(LadungRgvorschlag.class);
Join<Object, Object> ladung = from.join("ladung");
from.fetch("ladung", JoinType.INNER);
poi cerco di aderire a una tabella aggiuntiva del genere:
ladung.join("ladBerechnet");
ladung.fetch("ladBerechnet", JoinType.LEFT);
ottengo il seguente errore :
org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=generatedAlias3,role=null,tableName=ladberechnet,tableAlias=ladberechn3_,origin=ladungen ladung1_,columns={ladung1_.id ,className=de.schuechen.beans.tms.master.LadBerechnet}}] [select generatedAlias0 from de.schuechen.beans.tms.master.LadungRgvorschlag as generatedAlias0 inner join generatedAlias0.ladung as generatedAlias1 inner join generatedAlias1.ladBerechnet as generatedAlias2 left join fetch generatedAlias1.ladBerechnet as generatedAlias3 inner join fetch generatedAlias0.ladung as generatedAlias4 where (generatedAlias0.erledigt is null) and (generatedAlias0.belegart in (:param0, :param1)) and (generatedAlias1.fzadresse in (:param2, :param3)) and (generatedAlias1.zudatum<=:param4) and (1=1) order by generatedAlias0.belegart asc, generatedAlias1.fzadresse asc, generatedAlias1.zudatum asc, generatedAlias1.zulkw asc]
come posso dire JPA/Hibernate, che dovrebbe selezionare tutte le entità in una volta?
Funziona a causa di estensioni del fornitore in alcune implementazioni (come ad esempio Hibernate). In JPA, in generale, questa query JPQL non funziona, poiché non è necessario che tale catena e alias in questo caso siano supportati secondo le specifiche. –
Grazie per il chiarimento Mikko. È piuttosto brutto che tali estensioni vengano attivate silenziosamente, quindi le usi senza rendertene conto. –
Grazie finora. Utilizzare il recupero senza utilizzare un join prima di risolvere il problema. Tuttavia, vorrei mettere un predicato sulla tabella unita. come potrei farlo? Prima di utilizzare il seguente costrutto: Unire ladung = from.join ("ladung"); ladung.get ("fzadresse"). In (indirizzo); –
Stinnux