ひとめでConditionBean

ConditionBeanの機能

データの取得

データの取得 @Java
MemberCB cb = new MemberCB();

// <<< SetupSelect(Relation), SpecifyColumn >>>
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(new SubQuery<MemberLoginCB>() {
    public void query(MemberLoginCB subCB) {
        subCB.specify().columnLoginDatetime();
        subCB.query().setMobileLoginFlg_Equal_False();
    }
}, Member.ALIAS_latestLoginDatetime); // EMechaあれば ctrl + 1 で自動生成
// 必要に応じて、導出カラムをSQL関数で微調整
//}, Member.ALI..., new DerivedReferrerOption().coalesce("1192-01-01"));

// <<< LoadReferrer >>> ※これは検索の後
// 子テーブルのデータを取得する (one-to-many)
//  e.g. それぞれの会員に紐付く購入データを、購入日時の降順で検索(Load)
ListResultBean<Member> memberList = memberBhv.selectList(cb); // リスト検索
memberBhv.loadPurchase(memberList, new ConditionBeanSetupper<Pu...CB>() {
    public void setup(PurchaseCB cb) {
        cb.query().addOrderBy_PurchaseDatetime_Desc();
    }
});
// 子テーブルの子テーブルも取得する場合は、LoadReferrerOptionを使う
//LoadReferrerOption<MemberCB, Member> option
//        = new LoadReferrerOption<MemberCB, Member>();
//option.setConditionBeanSetupper(...);
//option.setEntityListSetupper(...);
//memberBhv.loadPurchaseList(memberList, option);

...

データの絞り込み

データの絞り込み @Java
...

// 等値 (=)
cb.query().setMemberId_Equal(1);
cb.query().setMemberStatusCode_Equal_正式会員(); // 区分値

// 非等値 (<>)
cb.query().setMemberId_NotEqual(1);
cb.query().setMemberStatusCode_NotEqual_正式会員(1); // 区分値

// 大なり小なり (><)
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);区分値
// not in (...) なら
//cb.query().setMemberId_NotInScope(...)

// 曖昧検索 (自動エスケープ付き)
cb.query().setMemberName_PrefixSearch("S"); // 前方一致 (like 'S%' escape '|')
cb.query().setMemberName_LikeSearch("vi"
    , new LikeSearchOption().likeContain()); // オプションでいろいろ
// to かつ vi が含まれてる
cb.query().setMemberName_LikeSearch("to vi"
    , new LikeSearchOption().likeContain().splitByBlank());
// to もしくは viが含まれてる
cb.query().setMemberName_LikeSearch("to vi"
    , new LikeSearchOption().likeContain().splitByBlank().asOrSplit());
// not like なら
//cb.query().setMemberName_NotLikeSearch(...)

// nullとかnullじゃないとか
cb.query().setBirthdate_IsNull();
cb.query().setBirthdate_IsNotNull();
cb.query().setMemo_IsNullOrEmpty();

// 日付の定型的なFromTo条件
//  e.g. 10月 から 12月 (まるごと含む) まで
Date fromMonth = new HandyDate("2005/10/01").getDate();
Date toMonth = new HandyDate("2005/12/01").getDate();
cb.query().setFormalizedDatetime_FromTo(fromMonth, toMonth
        , new FromToOption().compareAsMonth()); // オプションでいろいろ

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

// よく使うDateFromTo条件
//  e.g. 10/1 から 10/3 (まるごと含む) まで ※要は compareAsDate()
Date fromDate = new HandyDate("2005/10/01").getDate();
Date toDate = new HandyDate("2005/10/03").getDate();
cb.query().setFormalizedDatetime_DateFromTo(fromDate, toDate);

// 数値の定型的なRangeOf条件
//  e.g. 30 から 70 まで、もしくは null
cb.query().setMemberAge_RangeOf(30, 70, new RnageOfOption().orIsNull());

// <<< ExistsReferrer >>>
// 子テーブルの条件で絞り込み (exists (select ...))
//  e.g. 2000円以上の購入をしたことのある会員
cb.query().existsPurchaseList(new SubQuery<PurchaseCB>() {
    public void query(PurchaseCB subCB) {
        subCB.query().setPurchasePrice_GreaterEqual(2000);
    }
});
// not exists なら
// cb.query().notExistsPurchaseList(...)

// <<< InScopeRelation >>>
// existsじゃなくてinScopeで絞り込み (in (select ...))
//  e.g. 2000円以上の購入をしたことのある会員
cb.query().inScopePurchaseList(new SubQuery<PurchaseCB>() {
    public void query(PurchaseCB subCB) {
        subCB.query().setPurchasePrice_GreaterEqual(2000);
    }
});
// not in (...)
// cb.query().notInScopePurchaseList(...)

// <<< (Query)DerivedReferrer >>>
// 子テーブルの導出カラムで絞り込み (相関サブクエリ)
//  e.g. 支払い済み購入の最大購入価格が2000円以上である会員
cb.query().derivedPurchaseList().max(new SubQuery<PurchaseCB>() {
    public void query(PurchaseCB subCB) {
        subCB.specify().columnPurchasePrice();
        subCB.query().setPaymentCompleteFlg_Equal_True();
    }
}).greaterEqual(2000);
// 必要に応じて、導出カラムをSQL関数で微調整
//}, new DerivedReferrerOption().coalesce(0)).greaterEqual(...);

// <<< ScalarCondition >>>
// 自分自身の導出値との比較で絞り込み (普通のサブクエリ)
//  e.g. 一番若い正式会員の生年月日と同じ生年月日を持つ会員
cb.query().scalar_Equal().max(new SubQuery<MemberCB>() {
    public void query(MemberCB subCB) {
        subCB.specify().columnBirthdate();
        subCB.query().setMemberStatusCode_Equal_Formalized();
    }
});

// <<< ScalarConditionPartitionBy >>>
// カテゴリーごとの自分自身の導出値との比較で絞り込み (相関サブクエリ)
//  e.g. それぞれの会員ステータスごとに一番若い会員
cb.query().scalar_Equal().max(new SubQuery<MemberCB>() {
    public void query(MemberCB subCB) {
        subCB.specify().columnBirthdate();
    }
}).partitionBy(new SpecifyQuery<MemberCB>() {
    public void specify(MemberCB cb) {
        cb.specify().columnMemberStatusCode();
    }
});

// <<< MyselfInScope >>>
// 自分自身の回避的サブクエリで絞り込み (限定的回避策)
cb.query().myselfInScope(new SubQuery<MemberCB>() {
    public void query(MemberCB subCB) {
        //subCB.specify().column...() // 指定がなければ PK カラム
        subCB.query().setMemberStatusCode_Equal_Formalized(); // 絞り込み条件
    }
});

// <<< ColumnQuery >>>
// カラム同士の比較で絞り込み
//  e.g. 生年月日が正式会員日時よりも昔である会員
cb.columnQuery(new SpecifyQuery<MemberCB>() {
    public void specify(MemberCB cb) {
        cb.specify().columnBirthdate();
    }
}).lessThan(new SpecifyQuery<MemberCB>() {
    public void specify(MemberCB cb) {
        cb.specify().columnFormalizedDatetime();
    }
});
// 必要に応じて、右辺(もしくは左辺)のカラムをSQL関数で微調整
//}).convert(new ColumnConversionOption().truncTime().addDay(7));

// <<< OrScopeQuery >>>
// or条件 (デフォルトはand条件)
//  e.g. 会員名称が "S" もしくは "J" で始まる、もしくは、会員IDが 3 の会員
cb.orScopeQuery(new SubQuery<MemberCB>() {
    public void query(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(new SubQuery<MemberCB>() {
    public void query(MemberCB orCB) {
        orCB.query().setMemberStatusCode_Equal_Withdrawal();
        orCB.orScopeQueryAndPart(new AndQuery<MemberCB>() {
            public void query(MemberCB andCB) {
                andCB.query().setMemberId_GreaterEqual(100);
                andCB.query().setFormalizedDatetime_IsNull();
            }
        };
    }
});

// <<< UnionQuery >>>
// unionの追加
//  e.g. unionで、生年月日が2005年以降の会員を検索
cb.union(new UnionQuery<MemberCB>() {
    public void query(MemberCB unionCB) {
        Date targetDate = new HandyDate("2005/01/01").getDate();
        unionCB.query().setBirthdate_GreaterEqual(targetDate);
    }
});

...

データの並び替え

データの並び替え @Java
...

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();
Date date24before = new HandyDate(currentDate()).addDay(-1).getDate();
mob.when_GreaterThan(date24before); // 更新日時 > 24時間前
cb.query().addOrderBy_UpdateDatetime_Asc().withManualOrder(mob);

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

...

検索スタイル

検索スタイル @Java
...

// カウント検索
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(Date.class).max(new ScalarQuery<Me...CB>() {
    public void query(MemberCB cb) {
        cb.specify().columnBirthdate(); // 生年月日の最大値
        cb.query().setMemberStatusCode_Equal_Formalized(); // 正式会員に限る
    }
});

// <<< CursorSelect >>>
// カーソル検索する (一件ずつフェッチ)
memberBhv.selectCursor(cb, new EntityRowHandler<Member>() {
    public void handle(Member entity) {
        Integer memberId = entity.getMemberId();
        String memberName = entity.getMemberName();
        ...
    }
});

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

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

...

オプション

オプション @Java
...

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

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

...