Question

Mise en veille prolongée, je suis habitué à faire quelque chose comme ce qui suit:

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

Cependant, EclipseLink se plaint beaucoup sur ceci:

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 requête sur la pile est différente de celle ci-dessus, mais le résultat est le même)

Je l'ai essayé différentes combinaisons, dont aucun travaillé:

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

J'ai aussi essayé de passer à une autre entité dans mon modèle de domaine, soupçonnant que peut-être ma carte n'est pas correct. Pourtant, le même problème.

pourrait-il que je ne peux y parvenir en utilisant un indice de requête? Je ne veux pas le faire.

Par ailleurs, j'utilise EcliseLink comme livré avec Netbeans 6.8 et Glassfish v3.

Je vous remercie de toute aide!

Rodrigo

Était-ce utile?

La solution

Le principal problème est que la syntaxe de JPQL ne permet pas d'aliasing et rejoint La récupération de pourquoi EclipseLink utilise des notes de requête pour cette fonctionnalité. Il y a une demande d'amélioration d'ajouter aliasing se joindre va chercher directement dans le JPQL et si vous souhaitez le voir terminé s'il vous plaît voter pour elle. ( https://bugs.eclipse.org/bugs/show_bug.cgi?id = 293775 ).

- Gordon Yorke

Autres conseils

Eh bien, il semble que l'on n'a pas le droit à un alias FETCH rejoindre à JPQL, en effet .. Il fonctionne avec Hibernate, car il prend en charge l'aliasing par HQL, et vous êtes autorisés à émettre HQL à un objet de requête JPA.

Par conséquent, je n'avais pas d'autre choix que de passer à des requêtes nommées avec des notes de requête. Je ne aime vraiment pas déclarer les requêtes avec annotations en raison de la haute verbosité sur les classes d'entités, alors j'ai ajouté un fichier orm.xml au pot de l'unité de persistance, et fait ce qui suit:

<!-- 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>

Espérons que cela donne une idée à personne aux prises avec les mêmes défauts de la première JPQL.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top