Tengo varias entidades que se consultan a través de la consulta de criterios JPA2.Cómo recuperar todos los datos en una consulta
soy capaz de unirse a dos de estas entidades y obtener el resultado a la vez:
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);
entonces trato de unirse a una tabla adicional de esa manera:
ladung.join("ladBerechnet");
ladung.fetch("ladBerechnet", JoinType.LEFT);
me sale el siguiente error :
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]
¿Cómo puedo decirle a JPA/Hibernate, que debe seleccionar todas las entidades a la vez?
Funciona debido a las extensiones de proveedor en algunas implementaciones (como Hibernate, por ejemplo). En JPA en general, esta consulta JPQL no funciona, porque tal encadenamiento y alias en este caso no son necesarios para ser compatibles según la especificación. –
Gracias por la aclaración Mikko. Es bastante desagradable que esas extensiones se activen silenciosamente, así que las usas sin realmente darte cuenta. –
Gracias hasta ahora. El uso de buscar sin usar una combinación antes resuelve el problema. Sin embargo, me gustaría poner un predicado en la tabla unida. ¿Cómo podría hacer eso? Antes estaba usando la siguiente construcción: Unir ladung = from.join ("ladung"); ladung.get ("fzadresse"). In (adressen); –
Stinnux