[Seasar-user:11341] Re: [DBFlute] 外部結合について

kubo [E-MAIL ADDRESS DELETED]
2007年 10月 31日 (水) 12:39:16 JST


久保です。

米原さんへ

> >nの方に何か条件を固定で入れて、1:1で取得したいというわけでは>なく、
> >1:nの形でJava上に展開したいということでよろしいでしょうか?
> 
> 
> おそらくN側にwhere条件を追加して、結果的に1:1とすれば、
> 問題ないということですよね?
> 
> それだったら良かったんですが、今回、1:nとしてJava上に展開したいです。
> その場合、ドキュメントで紹介しているDBFluteでのApproachによる
> 対応になりますよね?

はい、1:nとしてJava上に展開したい場合は、
http://dbflute.sandbox.seasar.org/ja/tips-behavior-one_to_many_loading.html

でお願いします。


ここでも書いておきます。


【例えば以下の前提】

会員(MEMBER)と購入(PURCHASE)というテーブルがあり、関連が{1:n}

会員(MEMBER):
MEMBER_ID (PK)
MEMBER_NAME
MEMBER_STATUS_CODE (区分:正式会員・仮会員・退会会員}
REGIETER_DATE

購入(PURCHASE)
PURCHASE_ID (PK)
MEMBER_ID (FK to MEMBER)
PURCHASE_COUNT
PURCHASE_DATE


【例えば以下のような検索】

正式会員(MEMBER)の一覧を登録日時の降順で検索して、
かつ、その会員に紐付く「購入数が2個以上の購入(PURCHASE)」を
購入日の降順で取得

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
MemberCB cb = new MemberCB();
cb.query().setMemberStatusCode_Equal_Formalized();
cb.query().addOrderBy_RegisterDate_Desc();
List memberList = memberBhv.selectList(cb);

ConditionBeanSetupper<MemberCB> setupper = new ConditionBeanSetupper<MemberCB>() {
    public void setup(MemberCB cb) {
        cb.query().setPurchaseCount_GreaterEqual(2);
        cb.query().addOrderBy_PurchaseDate_Desc();
    }
};
memberBhv.loadPurchaseList(memberList, setupper);

for (Member member : memberList) {
    List<Purchase> purchaseList = member.getPurchaseList();

    // loadPurchaseList()を利用したことによって、
    // 指定した条件に該当する購入(PURCHASE)の一覧が取得できる。
    //
    // (loadPurchaseList()しない場合は、このpurchaseListが空っぽ)
    //
    for (Purchase purchase : purchaseList) {
        purchase.getPurchaseId();
        ...
    }
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 




> おそらくN側にwhere条件を追加して、結果的に1:1とすれば、
> 問題ないということですよね?

こちらに関しては、実は自分「結果的に1:1」で
実際にあまり試したことはないです。
(Where句を設定しなかったときに誤動作するので)

もし、固定の条件を入れることで「結果的に1:1」であれば、
どちらかというと以下のやり方を推奨します。

http://d.hatena.ne.jp/jflute/20071022/1193032003
http://d.hatena.ne.jp/jflute/20071023/1193111262






Seasar-user メーリングリストの案内