1

@ManyToOne 関係で一括削除を実行する方法を見つけようとしていますが、これまでのところ成功していません。

シナリオ:

親には多くのダウンロードがあります。親の日付が であるすべてのダウンロードの削除を実行したいと考えています> :some_date。親レコードは削除したくありません。ダウンロード レコードだけを削除します。Download には、@ManyToOne アノテーションを使用してマップされた親フィールドがあります。

これを実現するために、Download エンティティで @NamedQuery を使用しようとしています。

//this OQL tries to delete from both the child and parent tables
//I only want to delete from the Download table
DELETE FROM Download dwn 
    WHERE dwn.acctId = :acctId AND dwn.parent.date > :date

//this OQL is invalid and will keep the bean from deploying
//The example I found used this sub query but with a @OneToMany relationship
//instead of a @ManyToOne relationship
//this is what i get for an error on deployment:
//"Errors in named queries: deleteByAccountIdAndDownloadedDate"
DELETE FROM Download dwn WHERE EXISTS 
    (SELECT p from dwn.parent WHERE p.date > :date) 
    AND dwn.acctId = :acctId

助言がありますか?

4

2 に答える 2

1

私は最初のアプローチに固執します。エラーメッセージは表示されていますか?

ダウンロードと一緒に削除される親レコードに関しては...それらの間の関係にカスケードがありませんか?

于 2009-07-09T22:11:30.083 に答える
0

@ManyToOne アノテーションを削除し、Long parentId だけに置き換えることで、一括削除を機能させることができました。次に、フィールドの代わりに親の名前を使用するようにサブ選択を変更しました。

OQL は次のようになります。

DELETE FROM Download dwn WHERE EXISTS 
    (SELECT p FROM Parent p WHERE p.id = dwn.parentId and p.date > :date)

私はそれを試しませんでした(私がしていることにクエリ機能は必要ないため)が、@ManyToOneをそこに残してこのOQLを使用することができる場合:

DELETE FROM Download dwn WHERE EXISTS 
    (SELECT p FROM Parent p WHERE p.id = dwn.parent.id and p.date > :date)
于 2009-07-10T19:29:19.190 に答える