Grails удаляет все данные из класса таблицы / домена, т.е. "deleteAll" - PullRequest
11 голосов
/ 17 ноября 2011

У меня есть класс домена, Widget, из которого мне нужно удалить все экземпляры - очистить его. После этого я буду загружать свежие данные. Что вы предлагаете в качестве механизма для этого?

P.S. Обратите внимание, что это не во время начальной загрузки, а во время выполнения.

Ответы [ 5 ]

44 голосов
/ 17 ноября 2011

Самый простой способ - использовать HQL напрямую:

DomainClass.executeUpdate('delete from DomainClass')
3 голосов
/ 30 июня 2015
DomainClass.findAll().each { it.delete() }

Если вы хотите избежать каких-либо ошибок GORM, таких как необходимость немедленного удаления объекта и проверки его подлинности, добавьте несколько аргументов.

DomainClass.findAll().each { it.delete(flush:true, failOnError:true) }
1 голос
/ 18 мая 2018

Довольно старый пост, но все еще актуальный.

Если ваша таблица очень большая (миллионы записей), итерации с использованием findall () *. Delete () могут быть не лучшим вариантом, так как вы можете столкнуться с тайм-аутами транзакций (например, настройкой MySQL innodb_lock_wait_timeout), помимо заявленных потенциальных проблем с памятью от GreenGiant.

Так что, по крайней мере, для MySQL Innodb гораздо быстрее использовать TRUNCATE TABLE:

sessionFactory.currentSession
  .createSQLQuery("truncate table ${sessionFactory.getClassMetadata(MyDomainClass).tableName}")
  .executeUpdate()

Это полезно только в том случае, если на вашу таблицу другие объекты не ссылаются как на внешний ключ.

0 голосов
/ 04 января 2017

Из того, что я узнал, я согласен с @ataylor, приведенный ниже код будет самым быстрым, ЕСЛИ в вашем доменном объекте нет ассоциаций (что маловероятно в любом реальном приложении):

DomainClass.executeUpdate('delete from DomainClass')

Но если у вас есть ассоциации с другими доменами, самый безопасный способ удаления (а также чуть более медленный, чем упомянутый выше) будет следующим:

def domainObjects = DomainClass.findAll()
domainObjects.each { 
it.delete(flush:it==domainObjects.last, failOnError:true) 
}
0 голосов
/ 04 марта 2016

Если у вас есть список объектов и вы хотите удалить все элементы, вы можете использовать оператор *.

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

Пример.

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