114 votes

ERREUR HQL : Chemin attendu pour la jointure

Je n'arrête pas d'essayer des variantes de cette requête et je ne parviens pas à obtenir ce résultat. J'ai également fait référence à cet article : Voie attendue pour l'adhésion ! Erreur Nhibernate et je n'arrive pas à appliquer la même logique à ma requête. Mon User possède un UserGroup collection.

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

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

144voto

JB Nizet Points 250258
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"
)

Utiliser des chemins dans l'instruction HQL, d'une entité à l'autre. Voir l'instruction Documentation Hibernate sur HQL et les jointures pour plus de détails.

80voto

Marko Topolnik Points 77257

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

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

C'est le "chemin" dont se plaint le message d'erreur : le chemin entre le UserGroup et l'entité User.

Hibernate s'appuie sur des JOINs déclaratifs, pour lesquels la condition de jointure est déclarée dans les métadonnées de mapping. C'est pourquoi il est impossible de construire la requête SQL native sans disposer du chemin d'accès.

2voto

Il est préférable d'utiliser des clauses "où". Hibernate n'accepte pas les jointures internes pour les tables où la relation PK/FK n'existe pas entre les entités.

faire

SELECT s.first_name, s.surname, sd.telephone_number FROM Student s, StudentDetails sd WHERE s.id = sd.student_id

au lieu de

SELECT s.first_name, s.surname, sd.telephone_number FROM Student s INNER JOIN StudentDetails sd on s.id = sd.student_id

Ce dernier ne fonctionnera que si l'identifiant de l'étudiant (s.id) est référencé comme FK on StudentDetails (sd.student_id)) table design / erd

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X