有谁能告诉我实施软删除的好方法是什么?我的班级可以拥有deleted
属性,但我的问题是如何轻松忽略我的搜索,列表等中deleted = true
的实例。
所以,而不是说Domain.findByDeleted(true)
只是让Domain.list()
忽略已删除的实例,而不是说Domain.findByPropertyAndDeleted('property', true)
只是说Domain.findByProperty('property')
。
这样做有什么好办法吗?
答案 0 :(得分:7)
我建议使用named query。像
这样的东西static namedQueries = {
notDeleted {
ne 'deleted', true
}
}
您可以使用Domain.notDeleted.list()
或Domain.notDeleted.findByProperty(value)
答案 1 :(得分:1)
hibernate filter plugin可以自动将谓词deleted = false
添加到为特定域类执行的每个查询中。但是,我的测试表明此插件不适用于Grails 2.0.0。
答案 2 :(得分:0)
我们习惯于覆盖list()
,get()
以及其他一些域类方法。现在我们可以使用A.delete(log: true)
在bootstrap上,我们这样做:
grailsApplication.domainClasses.each { GrailsDomainClass domainClassInfo ->
def oldGormDelete = domainClassInfo.metaClass.getMetaMethod('delete', [] as Class[])
assert oldGormDelete
domainClassInfo.metaClass.delete = { Map params ->
...
def result = oldGormDelete.invoke(delegate)
...
}
}