数値の汎用的な範囲条件
概要
基本概念
数値の汎用的な範囲条件を設定します。RangeOf は、絞り込み条件を表す ConditionKey です。
内部的に GreaterEqual や LessThan などを利用して数値の範囲条件(foo から bar まで)を表現することができます。 RangeOf を利用しないと実現できない検索はありません。業務上よく利用される条件の組み合わせを汎用的に実現したものです。
会話上では、れんじおぶ と表現します。
実装方法
実装の流れ
query() の後、set[number-column-name]_RangeOf() を呼び出し、第一引数に min に相当する条件値、第二引数に max に相当する条件値、第三引数に RangeOfOption (必須)を指定します。
e.g. RangeOf条件の実装手順 (Eclipseでコード補完) {PURCHASE_PRICE} @Java
Integer minValue = ... // e.g. 3
Integer maxValue = ... // e.g. 7
cb.q // .q と打って enter
--
cb.query()
--
// 1. .set まで打つとカラム選択
// 2. PP (PurchasePrice) でカラム確定
// 3. RO (RangeOf) で enter
cb.query().setPPRO
--
cb.query().setPurchasePrice_RangeOf(minValue, maxValue, option);
--
cb.query().setPurchasePrice_RangeOf(minValue, maxValue, new RnageOfOption());
// e.g. PURCHASE_PRICE >= 3 and PURCHASE_PRICE <= 7
FromToほどリッチじゃない
日付の範囲条件 FromTo ほどリッチな機能ではありません。 数値に関してはあまりパターンが見当たらないからです。 あったとしても、数値だとプログラム上でも扱いやすいので、あまり DBFlute で提供する意味が無さそうで。
ただ、将来的に実装すると役に立ちそうなパターンがあれば、この機能に付け足していくつもりです。 今は単に、範囲条件が一行で書けるというのと、"もしくは null" の条件が書けるというだけの "ほんのちょい便利機能" という位置付けです。
パターンの比較条件
特にパターンによる比較条件ははありません。
手動で比較条件を調整
用意されているパターンの比較条件に合致しない場合は、手動で比較条件を調整することができます。
何もオプションが設定されていない RangeOfOption を指定した場合は、指定された条件値そのままに対して、単なる GreaterEqual と LessEqual を利用した範囲検索になります。Equal を Than に変えたい場合は、greaterThan(), lessThan() を呼び出すことで変更できます。
e.g. min を GreaterThan に変更して RangeOf {PURCHASE_PRICE} @Java
cb.query().setPurchasePrice_RangeOf(minValue, maxValue
, new RangeOfOption().greaterThan());
それだけです。
もしくは null
例えば、"30歳未満、もしくは null" というような条件を設定できます。 不明な値(null)を業務的に小さい方に含めたり、はたまた大きい方に含めたりする場合に有効です。
e.g. min を LessThan に変更して RangeOf {MEMBER_AGE} @Java
cb.query().setMemberAge_RangeOf(null, 30
, new RangeOfOption().lessThan().orIsnull());
// e.g. (MEMBER_AGE <= 30 or MEMBER_AGE is null)
OrScopeQuery を使っても同じことは実現できますが、こちらの方がすっきり書けます。また、OrScopeQuery は、AndPart の中でさらに OrScopeQuery をネストさせることができないため、AndPart 内でこういった or 条件を利用する必要がある場合に有効です。
メソッド仕様
基本仕様
- nullの指定
- 引数の minValue と maxValue が両方とも null の場合は、その条件は無効となります。片方だけが null の場合はもう一つの条件だけが有効になります。
- 同カラムに対する複数条件の指定
- 内部的に、GreaterEqual や LessThan など、別のメソッドを呼び出しているだけなので、その利用した条件の仕様通りです。
- 同カラムに対する同じ条件値での複数指定
- 内部的に、GreaterEqual や LessThan など、別のメソッドを呼び出しているだけなので、その利用した条件の仕様通りです。
指定されたオプションの再利用
RangeOfOption はスレッドセーフではありませんが、同じスレッド内であれば別のカラムに再利用することはできます。 全く同じオプションで、別のカラムも曖昧検索する場合に利用できます。
サポートされる型
- 数値全般 (IntegerやLongなど)
日付の RangeOf は、FromTo という別の名前で用意されています。 日付の方は数値よりも業務上の特殊なパターンが存在するため、リッチなものとなっております。