BŁĄD HQL: oczekiwana ścieżka do łączenia

100

Ciągle próbuję różnych odmian tego zapytania i nie wydaje mi się, aby tak się stało. Odwołałem się również do tego postu: Oczekiwana ścieżka do dołączenia! Nhibernate Error i nie mogę zastosować tej samej logiki do mojego zapytania. Mój Userobiekt ma UserGroupkolekcję.

Rozumiem, że zapytanie musi odwoływać się do jednostek w obiekcie, ale z tego, co widzę, jestem ...

@NamedQuery(
  name = "User.findByGroupId",
  query =
    "SELECT u FROM UserGroup ug " +
    "INNER JOIN User u WHERE ug.group_id = :groupId ORDER BY u.lastname"
)
Sieć internetowa
źródło

Odpowiedzi:

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

Jako nazwane zapytanie:

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

Użyj ścieżek w instrukcji HQL, od jednej jednostki do drugiej. Zobacz dokumentację Hibernate na temat HQL i złączeń, aby uzyskać szczegółowe informacje.

JB Nizet
źródło
32
Co to jest „ścieżka”? Przeszukałem dokumentację HQL, ale nie znalazłem definicji.
gwg,
7
oznacza to, że musisz połączyć jednostki: w jego przykładzie powyżej zwróć uwagę, jak wstawił ug.user u. Bez ug.user przed nim wystąpiłby błąd. Również 'user' w 'ug.user u' powinno być nazwą pola w Class UserGroup!
Lawrence,
6
Ta składnia HQL jest denerwująca. Musiałem znaleźć wiele przykładów i znalazłem twoje.
Bằng Rikimaru,
Wtedy nie mogę „ręcznie” łączyć jednostek bez wyraźnego mapowania (pola, które ma zostać użyte do połączenia) zadeklarowanego z Entity?
Pan Anderson,
67

Musisz nazwać podmiot, który posiada powiązanie z użytkownikiem. Na przykład,

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

To jest „ścieżka”, na którą skarży się komunikat o błędzie - ścieżka z grupy użytkowników do jednostki użytkownika.

Hibernate opiera się na deklaratywnych połączeniach JOIN, dla których warunek łączenia jest zadeklarowany w metadanych odwzorowania. Z tego powodu nie można zbudować natywnego zapytania SQL bez posiadania ścieżki.

Marko Topolnik
źródło
13
W końcu ktoś odpowiadający na temat źródła problemu ... (potrzeba przedrostka tabeli obcej istniejącym aliasem) rozwiązał mój problem, wielkie dzięki!
Saad Benbouzid
6
Co jeśli: nie utworzyłeś skojarzenia w jednostce i po prostu zapisałeś coś takiego jak „Long userId;”
Spektakulatius