Подтвердить что ты не робот

Как вы производите удаление записей в Grails/GORM?

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

Я ожидал, что я смогу использовать построитель критериев, чтобы просто удалить записи, но это не удается, потому что нет критерия 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, но это тоже неправильно. Является ли построитель критериев только предназначенным для извлечения?

Спасибо

4b9b3361

Ответ 1

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

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

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

Customer.executeUpdate("delete Customer c where c.name = :oldName", [oldName:"Fred"])

Ответ 2

С помощью 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 unit test mocks есть куча gotchas, но в целом довольно аккуратная.

Ответ 3

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

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