如何批量删除Grails / GORM中的记录?

时间:2010-02-09 21:21:12

标签: hibernate grails gorm

我有一张表,其中包含需要根据一组标准定期清除的记录。

我原以为我可以使用条件构建器来删除记录,但由于条件上没有delete方法,因此失败了...

def c = Agency.createCriteria()
c.delete
{
    eq("agency", "XXX")  
}

所以我想也许我首先查询该集合然后删除那个......

def c = Agency.createCriteria()
def deletions = c
{
    eq("agency", "XXX")  
}
deletions.delete

由于同样的原因,不同的对象也失败了。

那么这样做的正确方法是什么?似乎过度(反常),我将不得不遍历在每个项目上调用delete()的整个结果集。

我知道我可以形成一个查询,直接在HQL或SQL中执行,但这也是错误的。标准构建器仅用于检索吗?

由于

3 个答案:

答案 0 :(得分:50)

使用Grails 2.0,您可以使用这样的分离查询:

Agency.where { }.deleteAll()

请注意,您没有获取侦听器以及执行的内容,但它确实执行到数据库,并且它与模拟的域内容兼容,如:

void testWhatever() {
    mockDomain(Agency, [])
    saveABunchOfAgencies() // saves 10 of 'em
    assert Agency.count() == 10

    Agency.where { }.deleteAll()

    assert Agency.count() == 0   // Joy!
}

据说 GORM单元测试模拟有很多陷阱但总的来说非常整洁。

答案 1 :(得分:19)

来自User Guide about deleting objects

  

请注意,Grails不提供   deleteAll方法删除数据是   气馁,经常可以避免   通过布尔标志/逻辑。

     

如果确实需要批量删除   数据可以使用executeUpdate   批处理DML语句的方法:

Customer.executeUpdate("delete Customer c where c.name = :oldName", [oldName:"Fred"])

答案 2 :(得分:13)

如果你想避免使用HQL,我建议使用GORM list(),delete()和Groovy的扩展运算符:

def agencyList = Agency.createCriteria().list {
    eq("agency", "XXX")  
}
agencyList*.delete()