grails删除表/域类中的所有数据,即“deleteAll”

时间:2011-11-16 23:38:25

标签: grails gorm

我有一个域类,Widget,我需要删除所有实例 - 清除它。之后,我将加载新数据。你有什么建议做这个机制?

P.S。请注意,这不是在自举时间,而是在“运行时”。

5 个答案:

答案 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()