2011-11-16 73 views
11

我有一個域類,Widget,我需要刪除所有實例 - 清除它。之後,我將加載新的數據。你有什麼建議作爲一個機制來做到這一點?grails刪除表/域類中的所有數據,即「deleteAll」

P.S.請注意,這不是在引導時間,而是在「運行時」。

+0

這也回答http://stackoverflow.com/a/ 10278312/329954 – JesperSM

回答

42

最簡單的方法是使用HQL直接:

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

太好了,謝謝,這個工作非常快。 (與此無關 - 任何有關爲什麼篩選器不適用於篩選器/分割線問題的想法?是否適用於您?) – Ray

+0

這適用於最新版本的Grails。在2.4.4中還沒有。 – Gab

+0

@ataylor如果域類具有關聯,該怎麼辦?通常,我們希望刪除它們,而不僅僅是這個DomainClass –

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

如果你想避免任何GORM陷阱,如需要立即刪除對象和檢查,以確保它實際上被刪除,添加一些參數。

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

請注意,這將從數據庫將整個集合加載到內存中,然後分別使用單獨的數據庫查詢爲每個集合刪除每個集合。由於往返數據庫的次數,如果您不僅僅刪除了一些對象,而且這樣做的性能會很糟糕。 – GreenGiant

-1

如果您有一個對象列表並且想要刪除所有元素,則可以使用*運算符。

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

例子。

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

從我所學到的,我同意@ataylor下面的代碼是最快的,如果有你的域對象沒有關聯(在任何實際的應用可能性很小):

DomainClass.executeUpdate('delete from DomainClass') 

但是,如果你有與其他域,然後assiciations刪除最安全的方式(和也比上述一個慢一點)將如下所示:

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