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에서 직접 실행하기 위해 쿼리를 형성 할 수 있지만 잘못된 느낌이 듭니다. 기준 빌더가 검색을위한 것만 의미합니까?
감사
해결책
로부터 개체 삭제에 대한 사용자 안내서:
Grails는 데이터 삭제를 권장하지 않으므로 부울 플래그/논리를 통해 종종 피할 수 있으므로 Deleteall 방법을 제공하지 않습니다.
실제로 데이터를 배치 해야하는 경우 ExecuteUpdate 메소드를 사용하여 DML 문을 수행 할 수 있습니다.
Customer.executeUpdate("delete Customer c where c.name = :oldName", [oldName:"Fred"])
다른 팁
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가 있습니다. 그러나 일반적으로 꽤 깔끔합니다.
HQL을 피하려면 Gorm List (), Delete () 및 Groovy의 스프레드 연산자를 사용하는 것이 좋습니다.
def agencyList = Agency.createCriteria().list { eq("agency", "XXX") } agencyList*.delete()