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

问题描述:

我有一个域类,Widget,我需要删除所有实例 - 清除它。之后,我将加载新的数据。你有什么建议作为一个机制来做到这一点?grails删除表/域类中的所有数据,即“deleteAll”

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

+0

这也回答http://*.com/a/ 10278312/329954 – JesperSM

最简单的方法是使用HQL直接:

DomainClass.executeUpdate('delete from DomainClass') 
+0

太好了,谢谢,这个工作非常快。 (与此无关 - 任何有关为什么筛选器不适用于筛选器/分割线问题的想法?是否适用于您?) – Ray

+0

这适用于最新版本的Grails。在2.4.4中还没有。 – Gab

+0

@ataylor如果域类具有关联,该怎么办?通常,我们希望删除它们,而不仅仅是这个DomainClass –

DomainClass.findAll().each { it.delete() } 

如果你想避免任何GORM陷阱,如需要立即删除对象和检查,以确保它实际上被删除,添加一些参数。

DomainClass.findAll().each { it.delete(flush:true, failOnError:true) } 
+4

请注意,这将从数据库将整个集合加载到内存中,然后分别使用单独的数据库查询为每个集合删除每个集合。由于往返数据库的次数,如果您不仅仅删除了一些对象,而且这样做的性能会很糟糕。 – GreenGiant

如果您有一个对象列表并且想要删除所有元素,则可以使用*运算符。

'*' will split the list and pass its elements as separate arguments. 

例子。

List<Book> books = Book.findAllByTitle('grails') 
books*.delete() 

从我所学到的,我同意@ataylor下面的代码是最快的,如果有你的域对象没有关联(在任何实际的应用可能性很小):

DomainClass.executeUpdate('delete from DomainClass') 

但是,如果你有与其他域,然后assiciations删除最安全的方式(和也比上述一个慢一点)将如下所示:

def domainObjects = DomainClass.findAll() 
domainObjects.each { 
it.delete(flush:it==domainObjects.last, failOnError:true) 
}