ConditionBean

ConditionBeanの基本

ConditionBeanについて
ConditionBeanとは?概念やその存在意義などわりと事務的な話
ConditionBeanの使い方
実装手順やコード補完など ※ディベロッパーは必ず一度は目を通しましょう

ConditionBeanの機能

データの取得

取得できるカラム
  • 基点テーブルのカラム (デフォルト) - new FooCB()
  • many-to-one, one-to-one のカラム : SetupSelect(Relation) - cb.setupSelect_Foo() (.with...)
  • 業務的one-to-one のカラム : SetupSelect(BizOneToOne) - cb.setupSelect_Foo(value) (.with...)
  • one-to-many のカラム (バッチフェッチ) : Behavior.LoadReferrer - bhv.loadFooList(...)
  • 子テーブルの導出カラム (one-to-many) : (Specify)DerivedReferrer - cb.specify().derivedFooList()...
取得に関する調整
  • 取得カラムの指定 : SpecifyColumn - cb.specify().columnFoo(), cb.specify().specifyFoo().column...
  • 結果セットの統合 : UnionQuery - cb.union(new UnionQuery...), cb.unionAll(new UnionQuery...)

データの絞り込み

利用できるカラム
  • 基点テーブルのカラム : Query - cb.query().set...
  • many-to-one, one-to-one のカラム (*1) : Query(Relation) - cb.query().queryFoo().set...
  • 業務的one-to-one のカラム (*1) : Query(BizOneToOne) - cb.query().queryFoo(value).set...
  • 子テーブルのカラム (one-to-many) (*2) : ExistsReferrer - cb.query().existsFooList(new SubQuery...)
  • 子テーブルの導出カラム (one-to-many) : (Query)DerivedReferrer - cb.query().derivedFooList()...
*1: 親テーブルの条件で絞り込み *2: 子テーブルの条件で絞り込み
絞り込み条件
  • 等値 (=) : Equal - cb.query().setFoo_Equal(value)
  • 非等値 (<>) : NotEqual - cb.query().setFoo_NotEqual(value)
  • 大なり (>) : GreaterThan - cb.query().setFoo_GreaterThan(value)
  • 小なり (<) : LessThan - cb.query().setFoo_LessThan(value)
  • 大なりイコール (>=) : GreaterEqual - cb.query().setFoo_GreaterEqual(value)
  • 小なりイコール (<=) : LessEqual - cb.query().setFoo_LessEqual(value)
  • 対象値の列挙 (in ('a', 'b')) : InScope - cb.query().setFoo_InScope(valueList)
  • 前方一致の条件 (PrefixSearch条件) : PrefixSearch - cb.query().setFoo_PrefixSearch(value)
  • 曖昧検索の条件 (LikeSearch条件) : LikeSearch - cb.query().setFoo_LikeSearch(value, option)
  • null かどうか (is null) : IsNull - cb.query().setFoo_IsNull()
  • null か空文字かどうか (is null or empty) : IsNullOrEmpty - cb.query().setFoo_IsNullOrEmpty()
  • null でないかどうか (is not null) : IsNotNull - cb.query().setFoo_IsNotNull()
  • 日時の汎用的なFromTo条件 (FromTo条件) : FromTo - cb.query().setFoo_FromTo(...)
  • 日付の定型的なFromTo条件 (DateFromTo条件) : DateFromTo - cb.query().setFoo_DateFromTo(...)
  • 数値の汎用的なRangeOf条件 (RangeOf条件) : RangeOf - cb.query().setFoo_RangeOf(...)
  • 子テーブルの条件で絞り込み (exists) : ExistsReferrer - cb.query().existsFooList(new SubQuery...)
  • 関連テーブルの条件で絞り込み (in) : InScopeRelation - cb.query().inScopeFooList(new SubQuery...)
  • 子テーブルの導出カラムで絞り込み : (Query)DerivedReferrer - cb.query().derivedFooList()...
  • 自分自身の導出値との比較で絞り込み : (Myself)ScalarCondition - cb.query().scalar_Equal().max(...)
  • 自分自身の回避的サブクエリで絞り込み : MyselfInScope - cb.query().myselfInScope(new SubQuery...)
  • カラム同士の比較で絞り込み : ColumnQuery - cb.columnQuery(new SpecifyQuery...).lessThan...
連結条件
  • デフォルトは "and 条件" : Query - cb.query().set...
  • 明示的な指定で "or 条件" も可能 : OrScopeQuery - cb.orScopeQuery(new OrQuery...)
絞り込みに関する調整
  • "on 句" による結合前の絞り込み : OnClause - cb.query().queryFoo().on().set...
  • インラインビューによる結合前の絞り込み : InlineView - cb.query().queryFoo().inline().set...
  • ページング条件 : Paging - cb.paging(20, 4)
  • "先頭のn件" 条件 : FetchFirst - cb.fetchFirst(20)

データの並び替え

利用できるカラム
  • 基点テーブルのカラム : Query - cb.query().addOr...
  • many-to-one, one-to-one のカラム (*1) : Query(Relation) - cb.query().queryFoo().addOr...
  • 業務的one-to-one のカラム (*1) : Query(BizOneToOne) - cb.query().queryFoo(value).addOr...
  • (one-to-many)子テーブルの導出カラム : SpecifiedDerivedOrderBy - cb.query().addSpecifiedDer...
*1: 親テーブルのカラムで並び替え
並び替え条件
  • 昇順・降順ソート : OrderBy - cb.query().addOrderBy_Foo_Asc()
  • 指定した値の順番で並べる : ManualOrder - cb.query().addOrderBy_Foo_Asc().withManualOrder(orderList)
  • null を先・後に並べる : NullsFirst/Last - cb.query().addOrderBy_Foo_Asc().withNullsFirst()

検索スタイル

DomainEntityのオブジェクトグラフ
(一般的な)集計関数を使ったスカラ値

その他

検索全体に関する調整
  • 更新ロック (各種DBMSの構文を利用) : LockForUpdate - cb.lockForUpdate()
  • InnerJoinの自動判別 (チューニング用) : InnerJoinAutoDetect - cb.allowInnerJoinAutoDetect()
  • JDBCパラメータの指定 (queryTimeoutなど) : StatementConfig - cb.configure(...)
  • DBMS依存の機能 (ロックや全文検索など) : DatabaseDependency
  • 無効な条件のチェック (無効な条件があったら例外) : CheckInvalidQuery - cb.checkInvalidQuery()
{TwoEdgedSword}
※以下は厳重注意して利用すること
EmptyStringQuery
空文字条件の許可 (空文字を有効な値として扱う)
CheckSafetyResult
安全件数のチェック (指定件数以上なら例外)
DisableRelationMappingCache
関連テーブルのインスタンスキャッシュを無効化 (まず不要な機能)
(Manual)InnerJoin
結合方式を明示的に内部結合に(危険要注意)
EmbedCondition
バインド変数なし埋め込み条件 (危険要注意)
PagingSelectAndQuerySplit
ページング検索でselect句とwhere句を分割実行
その他いろいろ

Exampleのススメ

ConditionBeanの機能を利用したExample実装があります。

SVNリポジトリURL
https://www.seasar.org/svn/dbflute
Exampleプロジェクト
dbflute-basic-example (trunk)
初級編のクラス
ConditionBeanBasicTest
中級編のクラス
ConditionBeanMiddleTest
上級編のクラス
ConditionBeanPlatinumTest

ConditionBeanのスコープ

ConditionBean と 外だしSQL のどちらを使ったらよいのか迷ったら?

Effective ConditionBean

ConditionBean の効果的な使い方の指南

ひとめでConditionBean

とにかく、パッと見たかったら