This is a cache of http://dbflute.seasar.org/ja/manual/function/ormapper/outsidesql/select/selectentitywithdeletedcheck.html. It is a snapshot of the page at 2024-11-13T00:31:20.508+0000.
(外だしSQL)selectEntityWithDeletedCheck() | DBFlute

(外だしSQL)selectEntityWithDeletedCheck()

"外だしSQLの使い方" を既に読んでいることが前提となります。

1.1.x (Java8版) より、このメソッドは削除されました。selectEntity() が OptionalEntity を戻すので、それで存在有無を判断してください。WithDeletedCheck想定の検索であれば、alwaysPresent() か get() で良いです。

概要

外だしSQLで nullを戻さない一件検索 をします。検索結果が存在しない場合は明示的な例外が発生するので、検索結果がないという状況が業務的にあり得ない(条件設定のバグ、データ不整合など)、 もしくは、その状況は業務的なすれ違いなので排他制御の仕組みで一律の処理を行う、というようなときに利用します。

DeletedCheck の Deleted は、別の人(プロセス)のすれ違いによる削除のことを示します。

検索結果が存在しなかったら業務的に正常な処理を行う、という場合は、このメソッドではなく selectEntity() を利用して下さい。

会話上では、(外だしSQLの)せれくとえんてぃてぃうぃずでりーでぃっどちぇっく もしくは (外だしSQLの)nullを戻さないせれくとえんてぃてぃ と表現します。

実装方法

メソッドの呼び出し

手順は selectEntity() とほとんど同じで、最後に呼び出すメソッドが selectEntityWithDeletedCheck() となります。

e.g. 外だしSQLの一件検索の実装手順 (Eclipseでコード補完) @Java
memberBhv.o // .o と打って enter
--
memberBhv.outsideSql().en // .en と打って enter
--
memberBhv.outsideSql().entityHandling().selEW // .selEW と打って enter
--
memberBhv.outsideSql().entityHandling().selectEntityWithDeletedCheck(pmb);

selectEntity() との唯一の違いは、検索結果が存在しない場合の挙動です。

検索結果が存在しない場合

検索結果が存在しない場合は、条件もしくはSQLの不備と判断され、EntityAlreadyDeletedException が発生します。

e.g. 外だしSQLの一件検索で存在しないIDで検索して結果なくて寂しい @Java
String path = MemberBhv.PATH_selectSimpleMember;
SimpleMemberPmb pmb = new SimpleMemberPmb();
pmb.setMemberId(99999);
Class<?> entityType = SimpleMember.class;
try {
    memberBhv.outsideSql().entityHandling().selectEntityWithDeletedCheck(path, pmb, entityType)
} catch (EntityAlreadyDeletedException e) {
    ...
}

この例外が業務的なすれ違いで発生する可能性があるような状況で、かつ、それに対してアプリとして何かしらのアプローチをする要件があるならば、 排他制御エラーとしてアプリで一律の取扱いをする必要があります。

Behavior - selectEntityWithDeletedCheck(cb) - 検索結果が存在しない場合

なぜ、DeletedCheck なのか?

条件やSQLの不備よりも、業務的なすれ違いか何かで削除されてしまった、という状況に(も)着目していることを忘れないで欲しいためです。 ずっと昔に(名前を)付けて、普及したためにもう変えられないという噂もあります。