This is a cache of http://dbflute.seasar.org/ja/manual/function/ormapper/conditionbean/sidebar/checksafetyresult.html. It is a snapshot of the page at 2024-11-01T00:31:41.379+0000.
CheckSafetyResult | DBFlute

CheckSafetyResult

概要

玄人向け のスポット対応の機能です。普段は意識する必要はありません。

基本概念

ConditionBeanの検索結果が指定された件数を超えた場合に例外にします。

例えば、"このテーブルは件数が膨大なので間違っても全件検索したくない" かつ "絶対に n 件以下のデータであることが業務上確定している" というような場合に、(フェッチ処理の途中で)指定した件数を超えたことがすぐに例外で検知できます。 膨大な件数のテーブルを間違って全件検索してしまうと、DBアクセスの処理が戻ってきません(一件検索であれば二件目のデータ取得時に例外になるので、主にリスト検索が対象)。 テストすれば分かることとはいえ、SQLの処理が戻ってくるまでは何が起きているのかわからなかったりして(特に画面を経由した実行の場合)、意外にコストが掛かります。

無効な条件による予期せぬ全件検索などは、CheckInvalidQuery を使えば防げますが、それ以外の要因で余計な件数のデータが取れてしまうのを防ぐことができます。 例えば、絶対に 3 件しか取れないはずの検索が、データの不備で 4 件以上取れてしまう、というような場合のチェックにも利用できます。

諸刃の剣

TwoEdgedSword 認定のされた機能です。しっかり、精度高く利用しないと、逆にカオスを生み出します。 "場合によっては指定件数以上の検索もするかもしれない" というような場合にチェックを掛けてしまうと、いざというときに逆に面倒なことになります。 (特に、本番運用の中で初めてそういう場面が発生した、とかになるとかなりややこしい問題となるでしょう)

一件検索では内部的に利用

実は、一件検索(selectEntity)では内部的にこの機能を使っています。 一件検索が二件目のデータ取得時にすぐに例外になって早い段階で検知できるようになっているのはそういうことなのです。

実装方法

実装の流れ

絞り込み条件などを設定する前に、ConditionBean の checkInvalidQuery() を呼び出します。

e.g. ConditionBeanに絞り込み条件が設定されているかどうか (Eclipseでコード補完) @Java
MemberCB cb = new MemberCB();
cb.chSR // .chSR と打って enter
--
cb.checkSafetyResult(safetyMaxResultSize)
--
cb.checkSafetyResult(3); // 3 件以上で例外

メソッド仕様

QueryUpdate や QueryDelete では無効です。