24

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

我期待我可以使用标准构建器来删除记录,但这失败了,因为标准上没有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 中执行,但这也感觉不对。标准构建器是否仅用于检索?

谢谢

4

3 回答 3

51

使用 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 单元测试模拟有很多陷阱,但总的来说非常整洁。

于 2012-04-23T09:54:57.810 回答
19

有关删除对象的用户指南中

请注意,Grails 不提供 deleteAll 方法,因为不鼓励删除数据,并且通常可以通过布尔标志/逻辑来避免。

如果确实需要批量删除数据,可以使用 executeUpdate 方法批量执行 DML 语句:

Customer.executeUpdate("delete Customer c where c.name = :oldName", [oldName:"Fred"])
于 2010-02-09T22:46:31.003 回答
13

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

def agentList = Agency.createCriteria().list {
    eq("机构", "XXX")  
}
代理列表*.delete()
于 2010-02-10T12:34:18.480 回答