2011-07-08 8 views
6

Después de actualizar a una versión más reciente de hibernación (supongo que venía con el cambio de JBoss 4.2.2 a JBoss 6), algunas consultas fallan con el mensaje:"automática" recuperación por unión de las entidades anidadas falla después de actualizar Hibernate

Caused by: java.lang.IllegalArgumentException: 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=null,role=null,tableName= (...)

este es siempre el caso cuando se utiliza una consulta como esta:

SELECT entityA FROM EntityA entityA 
JOIN FETCH entityA.entityB 
LEFT JOIN FETCH entityA.entityB.someField 
WHERE entityA.entityB.anotherField LIKE :someParameter 

la solución al problema es dar "entityA.entityB" un alias y luego utilizar este alias en la cláusula WHERE. Pero en algunas consultas, el LEFT JOIN FETCH no se proporciona explícitamente, pero la cláusula WHERE usa la propiedad de una entidad a la que se hace referencia. ¿También fallará allí? ¿Qué ha cambiado, por lo que de repente falla después de cambiar a una nueva versión de JBoss?

La siguiente question está relacionada con esta pregunta e incluye la solución, pero no explica el problema.

+0

Su pregunta me ayudó a encontrar una solución a mi problema, después de actualizar de hibernate 3.2.6.ga a 3.5.6-Final, obtenía la 'consulta especificada de obtención de unión, pero el propietario de la asociación obtenida no era presente en la lista de selección ', usando el enfoque de alias que sugeriste que funciona, ¡no puedo ayudarte con el' por qué '! –

+0

es este HQL o JPQL estándar? – wrschneider

+0

Esto se hace a través de 'EntityManager.createQuery', así que supongo que es HQL. –

Respuesta

3

La consulta debe ser

SELECT entityA FROM EntityA entityA 
JOIN FETCH entityA.entityB entityB 
LEFT JOIN FETCH entityB.someField 
WHERE entityB.anotherField LIKE :someParameter 

es decir, debe asignar un alias a cada entidad unida y usar este alias para combinaciones o restricciones posteriores.

+0

Sí, lo sé ... pero siempre ha sido así. Y el cambio de Hibernate 3 a 4 cambió la aceptación de alguna manera y esto causa que mucha migración funcione para nosotros. Solo quería saber por qué de repente dejaron de hacer compatibles las versiones anteriores de Hibernate. –

+0

Supongo que su código funcionó por accidente, al basarse en un error de Hibernate que se ha solucionado ahora. –

0

Tengo el mismo problema en mi proyecto y es muy difícil de resolver porque tengo un gran sistema heredado con una gran cantidad de módulos que utilizan namedqueries precompilados y muchas consultas creadas a pedido. Identificar y modificar todo el sistema y hacer cambios donde funcionaba bien utilizando una versión anterior de hibernación es un trabajo muy molesto y propenso a errores. Estoy pasando por este problema en JBoss de 6.4 a 6.4.6 cuando la versión de hibernación se actualizó de 4.2.18 a 4.2.22 y aparece este error. Para resolverlo, realizo una degradación del módulo principal solo de hibernación a la versión predeterminada inicial 4.2.18, pero esto no es bueno porque cuando llegue el siguiente parche de JBoss, necesito cambiarlo de nuevo. Estoy intentando usar los módulos de JBoss y algunas configuraciones en persistence.xml y jboss-deployment-strcuture.xml pero sin éxito todavía.

Cuestiones relacionadas