ERREUR HQL: chemin attendu pour la jointure


100

Je continue d'essayer des variantes de cette requête et je n'arrive pas à y parvenir. J'ai également référencé cet article: Chemin attendu pour rejoindre! Erreur Nhibernate et ne semble pas pouvoir appliquer la même logique à ma requête. Mon Userobjet a une UserGroupcollection.

Je comprends que la requête doit référencer des entités dans l'objet, mais d'après ce que je vois, je suis ...

@NamedQuery(
  name = "User.findByGroupId",
  query =
    "SELECT u FROM UserGroup ug " +
    "INNER JOIN User u WHERE ug.group_id = :groupId ORDER BY u.lastname"
)

Réponses:


131
select u from UserGroup ug inner join ug.user u 
where ug.group_id = :groupId 
order by u.lastname

En tant que requête nommée:

@NamedQuery(
  name = "User.findByGroupId",
  query =
    "SELECT u FROM UserGroup ug " +
    "INNER JOIN ug.user u WHERE ug.group_id = :groupId ORDER BY u.lastname"
)

Utilisez des chemins dans l'instruction HQL, d'une entité à l'autre. Consultez la documentation Hibernate sur HQL et les jointures pour plus de détails.


32
Qu'est-ce qu'un «chemin»? J'ai cherché dans la documentation HQL mais je n'ai pas trouvé de définition.
gwg

7
cela signifie que vous devez lier les entités: dans son exemple ci-dessus, notez comment il met ug.user u. Sans le ug avant, vous obtiendrez l'erreur. De plus, le 'user' dans 'ug.user u' devrait être le nom du champ dans la classe UserGroup!
Lawrence du

6
Cette syntaxe HQL est agaçante. J'ai dû trouver beaucoup d'exemples et j'ai trouvé le vôtre.
Bằng Rikimaru

Alors je ne peux pas "manuellement" joindre des entités sans mappage explicite (champ à utiliser pour joindre) déclaré avec l'entité?
M. Anderson

67

Vous devez nommer l'entité qui détient l'association à User. Par exemple,

... INNER JOIN ug.user u ...

C'est le "chemin" dont se plaint le message d'erreur - chemin de UserGroup à l'entité User.

Hibernate repose sur des JOINs déclaratifs, pour lesquels la condition de jointure est déclarée dans les métadonnées de mappage. C'est pourquoi il est impossible de construire la requête SQL native sans avoir le chemin.


13
Enfin, quelqu'un répondant à la racine du problème ... (le besoin de préfixer une table étrangère avec un alias existant) a résolu mon problème, merci beaucoup!
Saad Benbouzid

6
Que faire si: vous n'avez pas créé d'association dans l'entité et simplement enregistré quelque chose comme 'Long userId;'
Spektakulatius
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.