Pregunta

Con Hibernate Estoy acostumbrado a hacer algo como lo siguiente:

select n from NetworkElement n join fetch n.site s where s.active is true

Sin embargo, EclipseLink se queja mucho de esto:

Caused by: Exception [EclipseLink-8024] (Eclipse Persistence Services - 2.0.0.v20091127-r5931): org.eclipse.persistence.exceptions.JPQLException Exception Description: Syntax error parsing the query [select n from NetworkElement n join fetch n.site s], line 1, column 49: syntax error at [s].

(La consulta en la pila es diferente de la anterior, pero el resultado es el mismo)

He intentado diferentes combinaciones, ninguno de los cuales trabajó:

select n from NetworkElement n join fetch n.site where n.site.active is true
select n from NetworkElement n join fetch n.site as site where site.active is true

También trató de cambiar a una entidad diferente en mi modelo de dominio, sospechando que tal vez mi asignación no es correcta. Sin embargo, el mismo problema.

Podría ser que sólo puedo lograr esto usando una sugerencia de consulta? No quiero hacer eso.

Por cierto, estoy usando EcliseLink como se envía con Netbeans 6.8 y GlassFish v3.

te agradecería cualquier ayuda!

Rodrigo

¿Fue útil?

Solución

El problema principal es que la sintaxis JPQL no permite ir a buscar aliasing se une y es por eso EclipseLink utiliza sugerencias de consulta para esta funcionalidad. Hay una petición para una mejora para agregar aliasing unirse recuperaciones directamente en la JPQL y si le gustaría ver que terminó voto favor de ella. ( https://bugs.eclipse.org/bugs/show_bug.cgi?id = 293775 ).

- Gordon Yorke

Otros consejos

Bueno, parece que no se le permite alias de una zona de alcance se unen en JPQL, de hecho .. Funciona con Hibernate porque es compatible con aliasing a través de HQL, y se le permite a la emisión HQL a un objeto de la APP consulta.

Por lo tanto, no tenía más remedio que cambiar a consultas con nombre con sugerencias de consulta. Yo no me gusta declarar consultas con anotaciones debido al alto nivel de detalle en las clases de entidad, por lo que añade un archivo orm.xml al frasco de la unidad de persistencia, y hizo lo siguiente:

<!-- Fetch network elements -->
<named-query name="fetchNetworkElements">
    <query>select n from NetworkElement n</query>
    <lock-mode>NONE</lock-mode>
    <hint name="eclipselink.join-fetch" value="n.site" />
    <hint name="eclipselink.join-fetch" value="n.site.area" />
</named-query>

Espero que esto da alguna pista a cualquiera luchando con las mismas deficiencias de la JPQL prima.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top