Как вы массово удаляете записи в Grails / GORM? - PullRequest
23 голосов
/ 10 февраля 2010

У меня есть таблица, в которой есть записи, которые необходимо периодически очищать в соответствии с набором критериев.

Я ожидал, что смогу использовать построитель критериев, чтобы просто удалить записи, но это не сработало, потому что в критериях нет delete метода ...

def c = Agency.createCriteria()
c.delete
{
    eq("agency", "XXX")  
}

Так что я подумал, может быть, я сначала запросить набор, а затем удалить это ...

def c = Agency.createCriteria()
def deletions = c
{
    eq("agency", "XXX")  
}
deletions.delete

Это также не работает по той же причине, другой объект.

Так каков правильный способ сделать это? Кажется чрезмерным (извращенным) то, что мне пришлось бы перебирать весь набор результатов, вызывая delete() для каждого элемента.

Я знаю, что могу сформировать запрос для непосредственного выполнения либо в HQL, либо в SQL, но это тоже неправильно. Создатель критериев предназначен только для поиска?

Спасибо

Ответы [ 3 ]

50 голосов
/ 23 апреля 2012

С Grails 2.0 вы можете использовать отдельный запрос, например:

Agency.where { }.deleteAll()

Обратите внимание, что вы не выполняете прослушиватели и все такое, но они выполняются до базы данных, И это совместимо с вещами из поддельного домена, как в:

void testWhatever() {
    mockDomain(Agency, [])
    saveABunchOfAgencies() // saves 10 of 'em
    assert Agency.count() == 10

    Agency.where { }.deleteAll()

    assert Agency.count() == 0   // Joy!
}

При этом в модульных тестах GORM есть куча ошибок , но в целом они довольно аккуратные.

19 голосов
/ 10 февраля 2010

Из Руководства пользователя по удалению объектов :

Обратите внимание, что Grails не предоставляет Метод deleteAll, поскольку удаление данных обескуражен и часто можно избежать через логические флаги / логику.

Если вам действительно нужно пакетное удаление данные, которые вы можете использовать executeUpdate метод выполнения пакетных операторов DML:

Customer.executeUpdate("delete Customer c where c.name = :oldName", [oldName:"Fred"])
13 голосов
/ 10 февраля 2010

Если вы хотите избежать HQL, я бы предложил использовать GORM list (), delete () и оператор распространения Groovy:

def agencyList = Agency.createCriteria().list {
    eq("agency", "XXX")  
}
agencyList*.delete()
...