Гибернация - Формула - недопустимый запрос - PullRequest
0 голосов
/ 03 августа 2020

У меня вопрос о формуле Hibernate.

Предположим, что у меня есть сущность «гараж», в которой находится множество «машин». Теперь я хотел бы добавить свойство в класс автомобиля, которое сообщает мне, какой номер автомобиля находится в гараже.

Я создал эту формулу для класса автомобиля:

@Formula("(SELECT pos FROM (SELECT rownum AS pos, c.id FROM garage g "
+ "LEFT JOIN car c ON g.id = c.garage_id "
+ "WHERE g.id = GARAGE_ID "
+ "ORDER BY c.date) WHERE id = CAR_ID)")

Автомобиль сущности имеет оба свойства (ID и GARAGE_ID). Как я могу теперь включить их в Формулу?

Кроме того, у меня проблема в том, что Hibernate всегда генерирует из него неверный SQL.

Pos становится query0_.pos. Однако это неверно.

1 Ответ

0 голосов
/ 03 августа 2020

Правило с фрагментом SQL внутри аннотации @Formula состоит в том, что любая «голая» (неквалифицированная) ссылка на столбец будет квалифицирована псевдонимом сущности, которой принадлежит формула.

Так, например, в этом @Formula:

@Formula("(select upper(isbn) || ' ' || upper(a.name) from authors a where a.id=author_id)")

Столбцы, к которым будет прикреплен квалификатор, - это isbn и author_id.

Так в вашем пример:

  • вы должны добавить квалификатор к pos, чтобы подавить это поведение, но
  • вы должны оставить id и garage_id неквалифицированными, поскольку они принадлежат сущности автомобиля .

Однако есть что-то, что кажется довольно запутанным в вашем коде. Зачем вам снова присоединяться к столу car здесь? Это выглядит не совсем правильно.

...