ひとめでConditionBean

ConditionBeanの機能

データの取得

ひとめでConditionBean @C#
MemberCB cb = new MemberCB();

cb.SetupSelect_MemberStatus(); // many-to-oneテーブルの取得
cb.Specify().SpecifyMemberStatus().ColumnMemberStatusName(); // 特定カラムだけ
cb.SetupSelect_MemberSecurityAsOne(); // one-to-oneの取得
cb.SetupSelect_MemberServiceAsOne().WithServiceRank(); // ネストしたテーブルの取得
cb.SetupSelect_MemberAddress(CurrentDate()); // 業務的one-to-oneの取得

// <<< (Specify)DerivedReferrer >>>
// 子テーブルの導出カラムを取得 (相関サブクエリ)
//  e.g. PCからの最終ログイン日時を取得
cb.Specify().DerivedMemberLoginList().Max(delegate(MemberLoginCB subCB) {
    subCB.Specify().ColumnLoginDatetime();
    subCB.Query().SetMobileLoginFlg_Equal_False();
}, Member.ALIAS_latestLoginDatetime); // プロパティは手動作成
// 必要に応じて、導出カラムをSQL関数で微調整
//}, Member.ALI..., new DerivedReferrerOption().coalesce("1192-01-01"));

// <<< LoadReferrer >>> ※これは検索の後
// 子テーブルのデータを取得する (one-to-many)
//  e.g. それぞれの会員に紐付く購入データを、購入日時の降順で検索(Load)
ListResultBean<Member> memberList = memberBhv.SelectList(cb); // リスト検索
memberBhv.LoadPurchaseList(memberList, delegate(PurchaseCB referrerCB) {
    referrerCB.Query().AddOrderBy_PurchaseDatetime_Desc();
});
// 子テーブルの子テーブルも取得する場合は、LoadReferrerOptionを使う
//LoadReferrerOption<MemberCB, Member> option
//        = new LoadReferrerOption<MemberCB, Member>();
//option.ConditionBeanSetupper = delegate(...);
//option.EntityListSetupper = delegate(...);
//memberBhv.LoadPurchaseList(memberList, option);

...

データの絞り込み

データの絞り込み @C#
...

// 等値 (=)
cb.Query().SetMemberId_Equal(1);
cb.Query().SetMemberStatusCode_Equal_正式会員(); // 区分値

// 非等値 (<>)
cb.Query().SetMemberId_NotEqual(1);
//cb.Query().SetMemberStatusCode_NotEqual_正式会員(1); ※.NET版では未サポート

// 大なり小なり (><)
cb.Query().SetMemberId_GreaterThan(3); // 大なり (>)
cb.Query().SetMemberId_LessThan(3); // 小なり (<)
cb.Query().SetMemberId_GreaterEqual(3); // 大なりイコール (>=)
cb.Query().SetMemberId_LessEqual(3); // 小なりイコール (<=)

// 対象値の列挙 (in ('a', 'b'))
cb.Query().SetMemberId_InScope(memberIdList);
//cb.Query().SetMemberStatusCode_InScope_AsMemberStatus(cdefList); ※.NET版では未サポート
// not in (...) なら
//cb.Query().SetMemberId_NotInScope(...)

// 曖昧検索 (自動エスケープ付き)
cb.Query().SetMemberId_PrefixSearch("S"); // 前方一致 (like 'S%' escape '|')
cb.Query().SetMemberId_LikeSearch("vi"
        , new LikeSearchOption().LikeContain()); // オプションでいろいろ
// to かつ vi が含まれてる
//cb.Query().SetMemberName_LikeSearch("to vi"
//    , new LikeSearchOption().LikeContain().SplitByBlank()); ※.NET版では未サポート
// to もしくは viが含まれてる
//cb.Query().SetMemberName_LikeSearch("to vi"
//    , new LikeSearchOption().LikeContain().SplitByBlank().AsOrSplit()); ※.NET版では未サポート
// not like なら
//cb.Query().SetMemberName_NotLikeSearch(...)

// nullとかnullじゃないとか
cb.Query().SetBirthdate_IsNull();
cb.Query().SetBirthdate_IsNotNull();
//cb.Query().SetMemo_IsNullOrEmpty(); ※.NET版では未サポート

// 日付の定型的なFromTo条件
//  e.g. 10月 から 12月(一杯) まで
DateTime fromMonth = ...(2005/10/01)
DateTime toMonth = ...(2005/12/01)
cb.Query().SetFormalizedDatetime_FromTo(fromMonth, toMonth
        , new FromToOption().CompareAsMonth()); // オプションでいろいろ ※.NET版では未サポート

// FromToで、"もしくはnull" 条件
//  e.g. 2005年 (まるごと含む) まで
//Date toYear = new HandyDate("2005/01/01").getDate();
//cb.query().setFormalizedDatetime_FromTo(null, toYear
//        , new FromToOption().compareAsYear().orIsNull()); ※.NET版では未サポート

// よく使うDateFromTo条件
//  e.g. 10/1 から 10/3 (まるごと含む) まで ※要は CompareAsDate()
DateTime fromDate = ...(2005/10/01)
DateTime toDate = ...(2005/10/03)
cb.Query().SetFormalizedDatetime_DateFromTo(fromDate, toDate);

// 数値の定型的なRangeOf条件
//  e.g. 30 から 70 まで、もしくは null
//cb.query().setMemberAge_RangeOf(30, 70, new RnageOfOption().OrIsNull()); ※.NET版では未サポート

// <<< ExistsReferrer >>>
// 子テーブルの条件で絞り込み (exists (select ...))
//  e.g. 2000円以上の購入をしたことのある会員
cb.Query().ExistsPurchaseList(delegate(PurchaseCB subCB) {
    subCB.Query().SetPurchasePrice_GreaterThan(2000);
});
// not exists なら
//cb.Query().NotExistsPurchaseList(...)

// <<< InScopeRelation >>>
// existsじゃなくてinScopeで絞り込み (in (select ...))
//  e.g. 2000円以上の購入をしたことのある会員
cb.Query().InScopePurchaseList(delegate(PurchaseCB subCB) {
    subCB.Query().SetPurchasePrice_GreaterThan(2000);
});
// not in (...) なら
//cb.Query().NotInScopePurchaseList(...)

// <<< (Query)DerivedReferrer >>>
// 子テーブルの導出カラムで絞り込み (相関サブクエリ)
//  e.g. 支払い済み購入の最大購入価格が2000円以上である会員
cb.Query().DerivedPurchaseList().Max(delegate(PurchaseCB subCB) {
    subCB.Specify().ColumnPurchasePrice();
    subCB.Query().SetPaymentCompleteFlg_Equal_True();
}).GreaterEqual(2000);
// 必要に応じて、導出カラムをSQL関数で微調整
//}, new DerivedReferrerOption().Coalesce(0)).GreaterEqual(...); ※.NET版では未サポート

// <<< ScalarCondition >>>
// 自分自身の導出値との比較で絞り込み (普通のサブクエリ)
//  e.g. 一番若い正式会員の生年月日と同じ生年月日を持つ会員
cb.Query().Scalar_Equal().Max(delegate(MemberCB subCB) {
    subCB.Specify().ColumnBirthdate();
    subCB.Query().SetMemberStatusCode_Equal_Formalized();
});

// <<< ScalarConditionPartitionBy >>>
// カテゴリーごとの自分自身の導出値との比較で絞り込み (相関サブクエリ)
//  e.g. それぞれの会員ステータスごとに一番若い会員
//cb.Query().Scalar_Equal().Max(delegate(MemberCB subCB) { ※.NET版では未サポート
//    subCB.Specify().ColumnBirthdate();
//}).PartitionBy(delegate(MemberCB subCB) {
//    subCB.Specify().ColumnMemberStatusCode();
//});

// <<< MyselfInScope >>>
// 自分自身の回避的サブクエリで絞り込み (限定的回避策)
cb.Query().MyselfInScope(delegate(MemberCB subCB) {
    //subCB.Specify().Column...() // 指定がなければ PK カラム
    subCB.Query().SetMemberStatusCode_Equal_正式会員(); // 絞り込み条件
});

// カラム同士の比較で絞り込み
//  e.g. 正式会員日時が退会日時よりも昔である会員
cb.ColumnQuery(delegate(MemberCB spCB) {
    spCB.Specify().ColumnFormalizedDatetime();
}).LessThan(delegate(MemberCB spCB) {
    spCB.Specify().SpecifyMemberWithdrawalAsOne().ColumnWithdrawalDatetime();
});
// 必要に応じて、右辺(もしくは左辺)のカラムをSQL関数で微調整
//}).Convert(new ColumnConversionOption().TruncTime().AddDay(7)); ※.NET版では未サポート

// <<< OrScopeQuery >>>
// or条件 (デフォルトはand条件)
//  e.g. 会員名称が "S" もしくは "J" で始まる、もしくは、会員IDが 3 の会員
cb.OrScopeQuery(delegate(MemberCB orCB) {
    orCB.Query().SetMemberName_PrefixSearch("S");
    orCB.Query().SetMemberName_PrefixSearch("J");
    orCB.Query().SetMemberId_Equal(3);
});

// <<< OrScopeQueryAndPart >>>
// or条件の中でand条件
//  e.g. 退会会員、もしくは、会員IDが100以上で正式会員日時がnullの会員
//cb.OrScopeQuery(delegate(MemberCB orCB) {
//    orCB.Query().SetMemberStatusCode_Equal_Withdrawal();
//    orCB.OrScopeQueryAndPart(delegate(MemberCB andCB) { ※.NET版では未サポート
//        andCB.Query().SetMemberId_GreaterEqual(100);
//        andCB.Query().SetFormalizedDatetime_IsNull();
//    });
//});

// <<< UnionQuery >>>
// unionの追加
//  e.g. unionで、生年月日が2005年以降の会員を検索
cb.Union(delegate(MemberCB unionCB) {
    DateTime targetDate = ...(2005/01/01);
    unionCB.Query().SetBirthdate_GreaterEqual(targetDate);
});

...

データの並び替え

データの並び替え @C#
...

cb.Query().AddOrderBy_MemberId_Asc(); // 昇順ソート
cb.Query().AddOrderBy_FormalizedDatetime_Desc(); // 降順ソート
cb.Query().AddOrderBy_Birthdate_Desc().WithNullsFirst(); // nullを先に
cb.Query().AddOrderBy_Birthdate_Desc().WithNullsLast(); // nullを後に

// <<< ManualOrder >>>
// 特定のロジックで手動ソートする
//  e.g. 24時間以内に更新されたものを優先して並べる
//ManualOrderBean mob = new ManualOrderBean();
//DateTime date24before = ...(24時間前)
//mob.When_GreaterThan(date24before); // 更新日時 > 24時間前
//cb.Query().AddOrderBy_UpdateDatetime_Asc().WithManualOrder(mob); ※.NET版では未サポート

// <<< SpecifiedDerivedOrderBy >>>
// 導出カラムでソートする
//  e.g. 最終ログインが近いものから
cb.Query().AddSpecifiedDerivedOrderBy_Desc(Member.ALIAS_latestLoginDatetime);

...

検索スタイル

検索スタイル @C#
...

// カウント検索
int count = memberBhv.SelectCount(cb);

// 一件検索 (なければnull)
Member member = memberBhv.SelectEntity(cb);

// 一件検索 (なければ例外)
Member member =  = memberBhv.SelectEntityWithDeletedCheck(cb);

// リスト検索
ListResultBean<Member> memberList = memberBhv.SelectList(cb);

// ページング検索
PagingResultBean<Member> page = memberBhv.SelectPage(cb);

// <<< ScalarSelect >>>
// 導出したスカラ値を検索する
//  e.g. 正式会員の中で、一番若い生年月日を検索
//Date max = memberBhv.ScalarSelect(typeof(DateTime)).max(delegate(MemberCB cb) { ※.NET版では未サポート
//    cb.Specify().ColumnBirthdate(); // 生年月日の最大値
//    cb.Query().SetMemberStatusCode_Equal_Formalized(); // 正式会員に限る
//});

// <<< CursorSelect >>>
// カーソル検索する (一件ずつフェッチ)
//memberBhv.SelectCursor(cb, delegate(Member entity) { ※.NET版では未サポート (外だしSQLでカーソル検索)
//    Integer memberId = entity.getMemberId();
//    String memberName = entity.getMemberName();
//    ...
//});

// <<< QueryDelete >>>
memberBhv.QueryDelete(cb);

// <<< QueryUpdate >>>
Member member = new Member();
member.SetMemberStatusCode_仮会員();
memberBhv.QueryUpdate(member, cb);

...

オプション

オプション @C#
...

// 条件値としてnullや空文字をセットしたら例外に (デフォルトでは無視される)
cb.CheckInvalidQuery();

// 更新ロックを取得する
cb.LockForUpdate();

...