HQL ERROR: Pfad für Join erwartet

100

Ich versuche immer wieder Variationen dieser Abfrage und kann dies scheinbar nicht bewirken. Ich habe auch auf diesen Beitrag verwiesen: Pfad für Beitritt erwartet! Nhibernate Error und kann anscheinend nicht dieselbe Logik auf meine Abfrage anwenden. Mein UserObjekt hat eine UserGroupSammlung.

Ich verstehe, dass die Abfrage Entitäten innerhalb des Objekts referenzieren muss, aber von dem, was ich sehe, bin ich ...

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

Antworten:

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

Als benannte Abfrage:

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

Verwenden Sie Pfade in der HQL-Anweisung von einer Entität zur anderen. Weitere Informationen finden Sie in der Hibernate-Dokumentation zu HQL und Joins .

JB Nizet
quelle
32
Was ist ein "Weg"? Ich habe die HQL-Dokumentation durchsucht, aber keine Definition gefunden.
GWG
7
es bedeutet, dass Sie die Entitäten verknüpfen müssen: Beachten Sie in seinem Beispiel hier oben, wie er ug.user u setzt. Ohne das ug davor würde der Fehler angezeigt. Außerdem sollte der 'Benutzer' in 'ug.user u' der Name des Feldes in der Klasse UserGroup sein!
Lawrence
6
Diese HQL-Syntax ist ärgerlich. Ich musste viele Beispiele finden und fand deine.
Bằng Rikimaru
Dann kann ich Entitäten nicht "manuell" verbinden, ohne eine explizite Zuordnung (Feld, das zum Verbinden verwendet werden soll), die mit der Entität deklariert wurde.
Mr. Anderson
67

Sie müssen die Entität benennen, die die Zuordnung zum Benutzer enthält. Beispielsweise,

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

Das ist der "Pfad", über den sich die Fehlermeldung beschwert - Pfad von UserGroup zur User-Entität.

Der Ruhezustand basiert auf deklarativen JOINs, für die die Verknüpfungsbedingung in den Zuordnungsmetadaten deklariert ist. Aus diesem Grund ist es unmöglich, die native SQL-Abfrage ohne den Pfad zu erstellen.

Marko Topolnik
quelle
13
Endlich hat jemand, der die Wurzel des Problems beantwortet hat (die Notwendigkeit, einer fremden Tabelle einen vorhandenen Alias ​​voranzustellen), mein Problem gelöst, vielen Dank!
Saad Benbouzid
6
Was ist, wenn: Sie keine Zuordnung in der Entität hergestellt und nur etwas wie "Lange Benutzer-ID" gespeichert haben?
Spektakulatius