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の削除テーブルでサブクエリを作成できないため、新しいエラーが発生します。

上記のクエリのいずれかを機能させるために書き直す方法について何か提案はありますか?

4

1 に答える 1

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;
于 2013-08-28T13:43:42.013 に答える