2013-08-28 2 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

Просто удалите подзапрос. Это не нужно. Я не знаю, как писать код SQL в Hybernate, но я предполагаю, что это будет что-то вроде этого:

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

удалить 'a' после' DELETE', синтаксис 'delete from ...' –

+0

Спасибо bellabax. Знает ли это, что просто удалить из таблицы ActiveTimes? В MySQL вы включаете псевдоним, чтобы он знал, какую таблицу удалить, если в вашем предложении FROM имеется несколько таблиц. – Tom

Смежные вопросы