queryDelete(cb)

概要

基本概念

ConditionBean の絞り込み条件に一致するレコード全てを削除します。

例えば、"とある会員のログイン情報を全て削除"、"未払い購入のある会員を全て削除" というような削除ができます。ConditionBean を指定します。

排他制御処理はありません。問答無用で削除します。

条件なしでの削除(NonQueryDelete)は、デフォルトでは許可されません(@since 0.9.7.8)

会話上では、くえりでりーと と表現します。ConditionBean のでりーと とも言えます。

実装方法

実装の流れ ※1.1.x (Java8版)

Behaviorの queryDelete() を呼び出し、ConditionBean を指定します。

e.g. queryDelete()の実装手順 (Eclipseでコード補完) {MEMBER} @Java
memberBhv.quD // .quD と打って enter
--

// メソッドが補完されて、引数の "cbLambda" が選択状態に
memberBhv.queryDelete(cbLambda)
--

// cbLambdaの部分で、_ll (補完テンプレートが有効なら)
memberBhv.queryDelete(_ll)
--

// Lambda引数名はcbにして...セミコロン ";" を忘れずに
memberBhv.queryDelete(cb -> {
    cb.query().set... // tabでカーソル移動してcbで検索条件
});

Entity には PK の値も不要です。更新値だけを設定します。

e.g. 未払い購入のある会員を全て削除 @Java
MemberCB cb = new MemberCB();
cb.query().existsPurchaseList(purchaseCB -> {
    purchaseCB.query().setPaymentCompeleteFlg_Equal_False();
});

memberBhv.queryDelete(cb);

絞り込み条件は、InScope を使ったサブクエリ方式です。

実装の流れ ※1.0.x (Java6版)

e.g. queryDelete()の実装手順 (Eclipseでコード補完) {MEMBER} @Java
memberBhv.quD // .quD と打って enter
--
memberBhv.queryDelete(cb);

// .qu と打つと queryDelete() や queryDelete() など
// クエリ更新系のメソッドだけが補完候補に列挙される

メソッド仕様

引数

該当のBehaviorに対応するテーブルのConditionBeanになります。(1.1.xよりコールバック)

nullを指定した場合は例外発生します。

戻り値

削除したレコードの件数が戻ります。削除対象が存在しなかった場合は 0 が戻ります。

例外

条件なし削除(全件削除)の場合
org.seasar.dbflute.exception.NonQueryDeleteNotAllowedException

DBMSによっては制限も

DBMSによっては利用できる機能に制限があります。例えば、MySQLは、delete 文の where 句のサブクエリにて更新対象のテーブルを参照できない、という制約があるため、サブクエリ方式ではなく、where 句に直接条件を展開しています。すると、Query(Relation) や ExistsReferrer などの関連テーブルを利用した絞り込み条件が利用できなくなります。

複合主キーの場合は制限

複合主キーの場合は制限は、サブクエリ方式が利用できないため、MySQLと同じ制限になります。

排他制御処理なし

排他制御処理はありません。

カスケードはしません

delete(entity) と同じ仕様です。

条件なしでの更新(全件更新)

条件なしでの削除(NonQueryDelete)は、デフォルトでは許可されません(@since 0.9.7.8)。 (万が一の)不意の全件更新を防ぐためです。どうしても全件更新をしたい場合は、varyingQueryDelete() を利用し、DeleteOption で許可するオプションを指定することで実現できます。

varyingQueryDelete(entity, cb, option)