我有一个域类,Widget,我需要删除所有实例 - 清除它。之后,我将加载新数据。你有什么建议做这个机制?
P.S。请注意,这不是在自举时间,而是在“运行时”。
答案 0 :(得分:44)
最简单的方法是直接使用HQL:
DomainClass.executeUpdate('delete from DomainClass')
答案 1 :(得分:3)
DomainClass.findAll().each { it.delete() }
如果你想避免任何GORM陷阱,例如需要立即删除对象并检查以确保它实际被删除,请添加一些参数。
DomainClass.findAll().each { it.delete(flush:true, failOnError:true) }
答案 2 :(得分:1)
相当老的帖子,但仍然是实际的。
如果你的表非常大(数百万条目),使用findall()* .dutore()进行迭代可能不是最好的选择,因为你可以遇到事务超时(例如MySQL innodb_lock_wait_timeout设置),除了潜在的内存问题作者:GreenGiant。
至少对于MySQL Innodb来说,使用TRUNCATE TABLE:
要快得多sessionFactory.currentSession
.createSQLQuery("truncate table ${sessionFactory.getClassMetadata(MyDomainClass).tableName}")
.executeUpdate()
仅当您的表未被其他对象作为外键引用时,此选项才有用。
答案 3 :(得分:0)
根据我的学习,我同意@ataylor,如果您的域对象中没有关联,则下面的代码是最快的(在任何实际应用程序中都不太可能):
DomainClass.executeUpdate('delete from DomainClass')
但是如果你与其他域有联系,那么最安全的删除方式(也比上面提到的要慢一点)如下:
def domainObjects = DomainClass.findAll()
domainObjects.each {
it.delete(flush:it==domainObjects.last, failOnError:true)
}
答案 4 :(得分:-2)
如果您有一个对象列表并想要删除所有元素,则可以使用*
运算符。
'*' will split the list and pass its elements as separate arguments.
实施例
List<Book> books = Book.findAllByTitle('grails')
books*.delete()