문제

일련의 기준에 따라 정기적으로 지워야하는 레코드가있는 테이블이 있습니다.

기준 빌더를 사용하여 레코드를 삭제할 수있을 것으로 기대했지만, 그렇지 않기 때문에 실패합니다. 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()
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top