ОШИБКА HQL: ожидаемый путь для соединения

100

Я продолжаю пробовать варианты этого запроса и, кажется, не могу этого добиться. Я также ссылался на этот пост: Ожидаемый путь для присоединения! Ошибка Nhibernate и, похоже, не может применить ту же логику к моему запросу. У моего Userобъекта есть UserGroupколлекция.

Я понимаю, что запрос должен ссылаться на сущности внутри объекта, но из того, что я вижу, я ...

@NamedQuery(
  name = "User.findByGroupId",
  query =
    "SELECT u FROM UserGroup ug " +
    "INNER JOIN User u WHERE ug.group_id = :groupId ORDER BY u.lastname"
)
Webnet
источник

Ответы:

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

В виде именованного запроса:

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

Используйте в операторе HQL пути от одной сущности к другой. Подробную информацию см. В документации Hibernate по HQL и объединениям .

JB Nizet
источник
33
Что такое «путь»? Я искал документацию HQL, но не нашел определения.
gwg 09
7
это означает, что вам нужно связать объекты: в приведенном выше примере обратите внимание на то, как он помещает ug.user u. Без ug перед ним вы получите сообщение об ошибке. Кроме того, «пользователь» в «ug.user u» должен быть именем поля в Class UserGroup!
Лоуренс
6
Этот синтаксис HQL раздражает. Пришлось найти много примеров и нашла ваш.
BANG Рикимару
Тогда я не могу "вручную" присоединиться к объектам без явного сопоставления (поля, которое будет использоваться для соединения), объявленного с Entity?
Мистер Андерсон
67

Вам нужно назвать сущность, которая содержит ассоциацию, с пользователем. Например,

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

Это «путь», на который жалуется сообщение об ошибке - путь от UserGroup до объекта User.

Hibernate полагается на декларативные JOIN, для которых условие соединения объявляется в метаданных сопоставления. Вот почему невозможно построить собственный SQL-запрос без указания пути.

Марко Топольник
источник
13
Наконец, кто-то, ответив на корень проблемы ... (необходимость префикса сторонней таблицы с существующим псевдонимом) решил мою проблему, большое спасибо!
Саад Бенбузид
6
Что, если: вы не создали ассоциацию в Entity и просто сохранили что-то вроде «Long userId»;
Spektakulatius