2011-11-16 2 views

risposta

42

Il modo più semplice è quello di utilizzare HQL direttamente:

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

Grande, grazie, funziona molto velocemente. (non correlato a questo - nessun pensiero sul perché il filtro non funziona per me nella domanda filtro/linee divisorie? Ha funzionato per te?) – Ray

+0

Questo funziona nelle versioni più recenti di Grails. In 2.4.4 non ancora. – Gab

+0

@ataylor Cosa succede se la classe dominio ha associazioni? Di solito, vorremmo eliminarli tutti, non solo questa query DomainClass –

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

Se si vuole evitare eventuali trucchi Gorm, come ad esempio la necessità di eliminare immediatamente l'oggetto e il controllo per assicurarsi che in realtà viene eliminato, aggiungere alcuni argomenti.

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

Si noti che questo caricherà l'intera raccolta, dal database, in memoria, quindi eliminerà ciascuno, individualmente, con una query di database separata per ciascuno. L'esecuzione di questo sarà terribile se si dispone di più di pochi oggetti da eliminare, a causa del numero di roundtrip al database. – GreenGiant

-1

Se si dispone di un elenco di oggetti e di voler eliminare tutti gli elementi, è possibile utilizzare * operatore.

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

Esempio.

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

Da quello che ho imparato, sono d'accordo con @ataylor il codice qui sotto è il più veloce se non ci sono associazioni nel oggetto di dominio (altamente improbabile in qualsiasi applicazione reale):

DomainClass.executeUpdate('delete from DomainClass') 

Ma se si hanno assiciations con altri domini, quindi il modo più sicuro per cancellare (e anche un po 'più lento di quello di cui sopra) sarebbe il seguente:

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