web-dev-qa-db-ja.com

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のいずれかで直接実行するクエリを作成できることは知っていますが、それも間違っていると感じています。基準ビルダーは検索のみを目的としていますか?

ありがとう

23
Simon

オブジェクトの削除に関するユーザーガイド から:

データの削除は推奨されておらず、ブールフラグ/ロジックを使用して回避できることが多いため、GrailsはdeleteAllメソッドを提供しないことに注意してください。

本当にデータをバッチ削除する必要がある場合は、executeUpdateメソッドを使用してバッチDMLステートメントを実行できます。

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

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ユニットテストモックにはたくさんの落とし穴がありますしかし、一般的にはかなりきれいです。

50
JesperSM

HQLを回避したい場合は、GORM list()、delete()、およびGroovyのスプレッド演算子を使用することをお勧めします。

 def AgencyList = Agency.createCriteria()。list {
 eq( "agency"、 "XXX")
} 
 agencyList * .delete()
13
sbglasius