ПОМИЛКА 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"
)

Відповіді:


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 від однієї сутності до іншої. Докладні відомості див. В документації зі сплячого режиму на HQL та приєднується .


32
Що таке "стежка"? Я шукав документацію HQL, але не знайшов визначення.
gwg

7
це означає, що вам потрібно зв’язати сутності: у його прикладі, наведеному вище, зверніть увагу, як він ставить ug.user u. Без уг перед цим ви отримаєте помилку. Крім того, "користувачем" в "ug.user u" має бути назва поля в Class UserGroup!
Лоуренс

6
Цей синтаксис HQL дратує. Мені довелося знайти багато прикладів і знайшов твій.
Bằng Rikimaru

Тоді я не можу "вручну" приєднатися до об'єктів без явного відображення (поле, яке використовується для приєднання), оголошеного в Entity?
Містер Андерсон

67

Вам потрібно назвати особу, яка має асоціацію, для користувача. Наприклад,

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

Ось "шлях", на який скаржиться повідомлення про помилку - шлях від UserGroup до об'єкта Користувача.

Hibernate покладається на декларативні JOIN, для яких умова приєднання оголошується у відображенні метаданих. Ось чому неможливо побудувати власний запит SQL, не маючи шляху.


13
Нарешті хтось, відповідаючи на корінь питання ... (необхідність префіксу іноземної таблиці з існуючим псевдонімом), вирішив мою проблему, велике спасибі!
Саад Бенбузід

6
Що робити, якщо ви не створили асоціацію в Entity і просто зберегли щось на кшталт "Long userId;"
Spektakulatius
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.