Как выполнить массовое удаление со связью в EJB3 - PullRequest
1 голос
/ 10 июля 2009

Я пытаюсь выяснить, как выполнить массовое удаление в отношении @ManyToOne, но пока безуспешно.

Сценарий:

Родитель имеет много загрузок, я хочу выполнить удаление всех загрузок, где родительская дата равна > :some_date. Я не хочу удалять какие-либо записи Родителя, только записи Загрузки. Загрузка имеет родительское поле, которое отображается с помощью аннотации @ManyToOne.

Я пытаюсь использовать @NamedQuery на объекте Download для достижения этой цели.

//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

Есть предложения?

Ответы [ 2 ]

1 голос
/ 10 июля 2009

Я бы придерживался первого подхода. Отображается ли сообщение об ошибке?

Когда речь идет об удалении родительских записей вместе с загрузками ... Вы уверены, что у вас нет каскада между ними?

0 голосов
/ 10 июля 2009

Мне удалось заставить массовое удаление работать, сняв аннотацию @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)
...