возможно ли преобразовать SQL-запрос с помощью подзапроса в предложении 'FROM' из-за HQL - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть 2 таблицы: машина и доступность машины.Я хочу получить доступность с данного компьютера.Даже если нет доступных объектов, соответствующих моим критериям, я все равно хотел бы получить свою машину .Итак, я написал этот собственный SQL-запрос:

select *
from (
       select ma.*
       from machine m1
       join machine_availability ma on m1.id = ma.id_machine
       where m1.id = 43
         and ma.available is true
         and ma.id_day > '20190228'
     ) as m
       right join machine m2 on m2.id = m.id_machine
where m2.id = 43;

Дело в том, что я обязан сделать его HQL-запросом, потому что моя связь @OneToMany между Machine и MachineAvailability - LAZY.Но я прочитал в документе, что HQL не поддерживает подзапросы в предложении 'FROM'.

У кого-нибудь есть идеи, как я мог бы преобразовать его в HQL?

Или, может быть, я мог бы использовать свой собственный запрос, если я что-то изменил в своем коде Java?

1 Ответ

0 голосов
/ 28 февраля 2019

Сначала упростите ваш SQL

Прежде всего, упростите ваш SQL до этого (нет смысла дважды обращаться к machine):

select *
from machine m
left join machine_availability ma 
  on m.id = ma.id_machine
  and ma.available is true
  and ma.id_day > '20190228'
where m.id = 43;

А теперь это должно быть тривиальнопреобразовать в HQL или просто выполнить собственный запрос.

Примечание по использованию строк в качестве дат

Если вы можете, я настоятельно рекомендую не использовать читаемые человеком строкина твои свидания.Это приведет только к серьезной путанице в оценках кардинальности оптимизатора для ваших предикатов, что приведет к полному сканированию таблицы, когда индексы будут подходящими, и наоборот. Я писал об этом здесь .

...