Mam wiele obiektów, które są sprawdzane za pomocą kwerendy kryteriów JPA2.Jak pobrać wszystkie dane w jednym zapytaniu
Jestem w stanie dołączyć do dwóch z tych jednostek i uzyskać wynik na raz:
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);
potem spróbować dołączyć dodatkową tabelę tak:
ladung.join("ladBerechnet");
ladung.fetch("ladBerechnet", JoinType.LEFT);
pojawia się następujący błąd :
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]
Jak mogę powiedzieć WZP/Hibernacja, że powinien wybrać wszystkie podmioty na raz?
Działa z powodu rozszerzeń dostawców w niektórych implementacjach (takich jak na przykład Hibernacja). W JPA ogólnie to zapytanie JPQL nie działa, ponieważ takie połączenie i aliasy w tym przypadku nie muszą być obsługiwane zgodnie ze specyfikacją. –
Dzięki za wyjaśnienie Mikko. To dość nieprzyjemne, że takie rozszerzenia są cicho aktywowane, więc używasz ich nie zdając sobie z tego sprawy. –
Dzięki dotychczasowe. Używanie pobierania bez użycia łączenia przed rozwiązaniem problemu. Jednak chciałbym umieścić predykat na złączonym stole. jak mogłem to zrobić? Zanim użyłem następującej konstrukcji: Dołącz ladung = from.join ("ladung"); ladung.get ("fzadresse"). In (adressen); –
Stinnux