我有一张表,其中包含需要根据一组标准定期清除的记录。
我原以为我可以使用条件构建器来删除记录,但由于条件上没有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中执行,但这也是错误的。标准构建器仅用于检索吗?
由于
答案 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()