2013-08-28 112 views
0

我在我的應用程序中使用了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的刪除表上創建一個子查詢。

對於如何重寫上述查詢之一以使其工作,您有任何建議嗎?

+0

這是MySQL的(很多)愚蠢的限制之一。您需要將子選擇重新寫入連接。 –

+0

@a_horse_with_no_name您可以詳細說明這個想法嗎?更重要的是,你能告訴我爲什麼查詢的第一個版本以這種模糊的方式翻譯了嗎?謝謝! – Dragos

+0

@a_horse_with_no_name答案已發佈。那是JPQL查詢的樣子嗎? – Dragos

回答

0

只要刪除子查詢。這是沒有必要的。我不知道如何在Hybernate中編寫SQL代碼,但我猜這將是這樣的:

DELETE a 

FROM ActiveTimes a 

     JOIN a.source.stage st 
     JOIN st.level.dataSource ds 

WHERE a.begin>=:from AND a.begin<=:to 
     AND a.end>=:from AND a.end<=:to 
     AND ds.id=:dataSource; 
+0

如果我按照你的建議來做,我會得到這個錯誤:'意外的標記:FROM第1行第10列'。 – Dragos

+0

在DELETE後刪除'a',語法是'delete from ...' –

+0

謝謝bellabax。它會知道從ActiveTimes表中刪除嗎?在MySQL中,如果您的FROM子句中有多個表,則可以包含別名,以便知道要從哪個表中刪除。 – Tom