我在我的應用程序中使用了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