Я использую Hibernate в своем приложении. В настоящее время я пытаюсь выполнить следующий запрос:Удалить из подзапроса
DELETE FROM ActiveTimes a WHERE
a.begin>=:from AND a.begin<=:to
AND a.end>=:from AND a.end<=:to
AND a in(
SELECT al FROM ActiveTimes al
JOIN al.source.stage st
JOIN st.level.dataSource ds
WHERE ds=:dataSource)
Но я получаю сообщение об ошибке: Column 'id' in field list is ambiguous
. Это чувствует себя нормально, потому что созданный SQL-запрос выглядит следующим образом:
delete
from
active_times
where
begin>=?
and begin<=?
and end>=?
and end<=?
and (
id in (
select
id
from
active_times activeti1_
inner join
sources sourc2_
on activeti1_.source=sourc2_.id
inner join
stage stage3_
on sourc2_.id=stage3_.source
inner join
levels levels4_
on stage3_.level=levels4_.id
inner join
datasources datasource5_
on levels4_.data_source=datasource5_.id
where
id=?
)
)
Если изменить запрос:
DELETE FROM ActiveTimes a WHERE
a.begin>=:from AND a.begin<=:to
AND a.end>=:from AND a.end<=:to
AND a.id in(
SELECT al.id FROM ActiveTimes al
JOIN al.source.stage st
JOIN st.level.dataSource ds
WHERE ds.id=:dataSource)
я получаю другую ошибку: You can't specify target table 'active_times' for update in FROM clause
.
Я не очень экспериментировал с JPQL (или HQL), поэтому я не понимаю, почему запрос выглядит так, как в первом примере.
Новая ошибка возникает из-за того, что, по-видимому, я не могу сделать подзапрос в таблице удаления в MySQL.
Есть ли у вас какие-либо предложения относительно того, как я могу переписать один из вышеуказанных запросов, чтобы заставить его работать?
Это один из (многих) дурацких ограничений MySQL. Вам нужно переписать суб-выбор в соединение. –
@a_horse_with_no_name Не могли бы вы рассказать об этой идее? Более того, не могли бы вы рассказать мне, почему первая версия запроса была переведена так неоднозначно? Спасибо! – Dragos
@a_horse_with_no_name Ответ опубликован. Так выглядит JPQL-запрос? – Dragos