如何在EJB3中执行带关系的批量删除

时间:2009-07-09 21:49:59

标签: jpa ejb-3.0 bulk sql-delete

我试图找出如何在@ManyToOne关系上执行批量删除,到目前为止没有成功。

情景:

父有很多下载,我想删除父日期为> :some_date的所有下载。我不想删除任何父记录,只删除下载记录。下载具有使用@ManyToOne注释映射的父字段。

我正在尝试在下载实体上使用@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

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我会坚持第一种方法。是否显示任何错误消息?

当涉及将父级记录与下载一起删除时......您确定没有关于它们之间关系的级联吗?

答案 1 :(得分: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)