[Seasar-user:13537] Re: [DBFlute] LIKEをORでつなげたい

kubo [E-MAIL ADDRESS DELETED]
2008年 4月 3日 (木) 12:59:17 JST


久保です。

加藤さん

BasicExampleのDBFlute-0.6.8(SNAPSHOT)にて実装してみました。
MemberCBLikeSearchTestの
test_ConditionBean_query_setMember_LikeSearch_likeContain_splitBySpace_asOrSplit_Tx()
にてExample実装があります。

String keyword = "ス イ ノ";
MemberCB cb = new MemberCB();
LikeSearchOption option
    = new LikeSearchOption().likeContain().splitBySpace().asOrSplit();
cb.query().setMemberName_LikeSearch(keyword, option);
List<Member> memberList = memberBhv.selectList(cb);

  ↓↓↓

where (dflocal.MEMBER_NAME like '%ス%'
          or dflocal.MEMBER_NAME like '%イ%'
          or dflocal.MEMBER_NAME like '%ノ%')

splitByXxx()の後のasOrSplit()がポイントです。

2008/4/2 Junichi Kato <[E-MAIL ADDRESS DELETED]>:
> 久保さん
> 加藤です.
>
> ご検討ありがとうございます.
> 外だしSQLの動的バインド変数検索についても少し試してみたいと思います.
>
> 08/04/02 に kubo <[E-MAIL ADDRESS DELETED]> さんは書きました:
>
>
> > 久保です。
> >
> > 加藤さん、こんばんは
> >
> > なるほど了解です。
> > 確かにLikeだけは非常に特殊な演算子で、
> > 定型的に条件をORでつなげたくなりますね。
> > 中間一致だったらインデックス問題も関係ないですし。
> > ちょっと実現可能性を探ります。
> >
> > LikeSearchOptionのsplitByXxx()で何かしらでOR指定できるように
> > しようと考えています。(xxx like '%a%' or xxx like '%b%' or ...)
> >
> >
> > >  いって外だしSQLではLIKEのFOR文が書けないので実装できない。
> >
> > これ非常によくわかります。
> > 一応、DBFluteでは埋め込み変数コメント内のバインド変数コメントを
> > 認識できるようにするモードを設けていますのでご参考までに。
> > http://dbflute.sandbox.seasar.org/contents/outside-sql/dynamic.html
> >
> >
> > 2008/4/1 Junichi Kato <[E-MAIL ADDRESS DELETED]>:
> > > 久保さん
> > >  加藤です。
> > >
> > >  お返事が遅れてすみませんw
> > >
> > >  以下理解できました。
> > >  が、UNIONだとSQLがぶあーっと増えてデバッグが大変なのと、やはりCBを構成す
> > >  る処理が複雑化するのでLIKEのORでつなげる機能はほしいところです。
> > >  検索対象のカラムの多いのでちょっとこの方法はつらいんですよね。。。かと
> > >  いって外だしSQLではLIKEのFOR文が書けないので実装できない。
> > >  ご検討いただけたら幸いです。
> > >
> > >
> > >  kubo さんは書きました:
> > >
> > >
> > > > 久保です。
> > >  >
> > >  > 加藤さん
> > >  >
> > >  >
> https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-basic-example
> > >  > MemberCBTest#test_selectList_union_LikeSearch_Tx()
> > >  > にExample実装してみました。
> > >  >
> > >  > 2008/3/29 kubo <[E-MAIL ADDRESS DELETED]>:
> > >  >
> > >  >> 久保です。
> > >  >>
> > >  >>  加藤さん、こんにちは
> > >  >>
> > >  >>  ANDとかORという感じではなく、
> > >  >>
> > >  >>  select ...
> > >  >>    from XXX
> > >  >>   where YYY like 'a%'
> > >  >>  union
> > >  >>  select ...
> > >  >>    from XXX
> > >  >>   where YYY like 'b%'
> > >  >>  union
> > >  >>  select ...
> > >  >>    from XXX
> > >  >>   where YYY like 'c%'
> > >  >>
> > >  >>  という感じのSQLになるはずですが、
> > >  >>  そうならないでしょうか?
> > >  >>
> > >  >>  # ちなみにsplitByXxx()は利用せず、
> > >  >>  # 自分でsplitで「for (String keyword : keywordList) {」
> > >  >>  # するイメージです。
> > >  >>
> > >  >>  2008/3/28 Junichi Kato <[E-MAIL ADDRESS DELETED]>:
> > >  >>
> > >  >>
> > >  >>
> > >  >>> 久保さん、
> > >  >>>
> > >  >>  >  加藤です。
> > >  >>  >
> > >  >>  >  以下を試してみたのですが、ANDでつながってしまうようです。
> > >  >>  >  ORでつなげるのは無理ですかね?
> > >  >>  >
> > >  >>  >
> > >  >>  >  kubo さんは書きました:
> > >  >>  >
> > >  >>  >
> > >  >>  > > 久保です。
> > >  >>  >  >
> > >  >>  >  > 加藤さん、こんばんは
> > >  >>  >  >
> > >  >>  >  > 昼はちょっと取り込んでて取り急ぎコメントでしたが、
> > >  >>  >  > 実装イメージとしては以下のような感じになると思います。
> > >  >>  >  > (動かしてないのであくまでイメージということで)
> > >  >>  >  >
> > >  >>  >  > XxxCB cb = new XxxCB();
> > >  >>  >  > cb.setupSelect_...
> > >  >>  >  > boolean first = true;
> > >  >>  >  > for (String keyword : keywordList) {
> > >  >>  >  >     if (first) {
> > >  >>  >  >         cb.query().setYyy_LikeSearch(keyword, new Like...);
> > >  >>  >  >         first = false;
> > >  >>  >  >         continue;
> > >  >>  >  >     }
> > >  >>  >  >     XxxCB unionCB = new XxxCB();
> > >  >>  >  >     unionCB.query().setYyy_LikeSearch(keyword, new LiKe...);
> > >  >>  >  >     cb.union(unionCB.query())
> > >  >>  >  > }
> > >  >>  >  >
> > >  >>  >  > 2008/3/26 Junichi Kato <[E-MAIL ADDRESS DELETED]>:
> > >  >>  >  >
> > >  >>  >  >> 久保さん、
> > >  >>  >  >> 加藤です。どうもです。
> > >  >>  >  >>
> > >  >>  >  >> 了解しました。unionでやってみます。
> > >  >>  >  >>
> > >  >>  >  >>
> > >  >>  >  >> 08/03/26 に kubo <[E-MAIL ADDRESS DELETED]> さんは書きました:
> > >  >>  >  >>
> > >  >>  >  >>
> > >  >>  >  >>
> > >  >>  >  >>> 久保です。
> > >  >>  >  >>>
> > >  >>  >  >>> 加藤さん、こんにちは
> > >  >>  >  >>>
> > >  >>  >  >>> 取り急ぎコメントさせて頂きます。
> > >  >>  >  >>> splitByXxx()をor条件とする機能は今はありません。
> > >  >>  >  >>> OR条件に関しては、ConditionBean.union()をご利用下さい。
> > >  >>  >  >>> 但し、splitByXxx()で一本の文字列を分解するのは自分で
> > >  >>  >  >>> 処理することにはなってしまいます。
> > >  >>  >  >>>
> > >  >>  >  >>>
> > >  >>  >  >>> 2008/3/26 Junichi Kato <[E-MAIL ADDRESS DELETED]>:
> > >  >>  >  >>>
> > >  >>  >  >>>> 加藤です。
> > >  >>  >  >>>>
> > >  >>  >  >>>>  お世話になります。
> > >  >>  >  >>>>  DBFluteの質問です。
> > >  >>  >  >>>>
> > >  >>  >  >>>>
> > >  >>  >  >>>>
> > >  >>  >  >>
> http://dbflute.sandbox.seasar.org/ja/tips-condition_bean_comparison.html
> > >  >>  >  >>
> > >  >>  >  >>>>  〉{Split処理} splitByXxx()を呼び出すことで、引数のvalueをSplitして複数の
> > >  >>  >  >>>>  AND条件として付与できます。
> > >  >>  >  >>>>  とあるのですが、
> > >  >>  >  >>>>
> > >  >>  >  >>>>  LIKEにて複数の検索条件をORでつなげる場合はどのようにするのがよいのでしょ
> > >  >>  >  >>>>  うか?
> > >  >>  >  >>>>  アドバイスをお願いいたします。
> > >  >>  >  >>>>
> > >  >>  >  >>>>
> > >  >>  >  >>>>
> > >  >>  >  >>>>
> > >  >>  >  >>>>
> > >  >>  >  >>>>  _______________________________________________
> > >  >>  >  >>>>  Seasar-user mailing list
> > >  >>  >  >>>>  [E-MAIL ADDRESS DELETED]
> > >  >>  >  >>>>  https://ml.seasar.org/mailman/listinfo/seasar-user
> > >  >>  >  >>>>
> > >  >>  >  >>>>
> > >  >>  >  >>> _______________________________________________
> > >  >>  >  >>> Seasar-user mailing list
> > >  >>  >  >>> [E-MAIL ADDRESS DELETED]
> > >  >>  >  >>> https://ml.seasar.org/mailman/listinfo/seasar-user
> > >  >>  >  >>>
> > >  >>  >  >>>
> > >  >>  >  >> _______________________________________________
> > >  >>  >  >>  Seasar-user mailing list
> > >  >>  >  >>  [E-MAIL ADDRESS DELETED]
> > >  >>  >  >>  https://ml.seasar.org/mailman/listinfo/seasar-user
> > >  >>  >  >>
> > >  >>  >  >>
> > >  >>  >  >>
> > >  >>  >  > _______________________________________________
> > >  >>  >  > Seasar-user mailing list
> > >  >>  >  > [E-MAIL ADDRESS DELETED]
> > >  >>  >  > https://ml.seasar.org/mailman/listinfo/seasar-user
> > >  >>  >  >
> > >  >>  >
> > >  >>  >  _______________________________________________
> > >  >>  >  Seasar-user mailing list
> > >  >>  >  [E-MAIL ADDRESS DELETED]
> > >  >>  >  https://ml.seasar.org/mailman/listinfo/seasar-user
> > >  >>  >
> > >  >>
> > >  >>
> > >  > _______________________________________________
> > >  > Seasar-user mailing list
> > >  > [E-MAIL ADDRESS DELETED]
> > >  > https://ml.seasar.org/mailman/listinfo/seasar-user
> > >  >
> > >
> > >  _______________________________________________
> > >  Seasar-user mailing list
> > >  [E-MAIL ADDRESS DELETED]
> > >  https://ml.seasar.org/mailman/listinfo/seasar-user
> > >
> > _______________________________________________
> > Seasar-user mailing list
> > [E-MAIL ADDRESS DELETED]
> > https://ml.seasar.org/mailman/listinfo/seasar-user
> >
>
>
> _______________________________________________
>  Seasar-user mailing list
>  [E-MAIL ADDRESS DELETED]
>  https://ml.seasar.org/mailman/listinfo/seasar-user
>
>


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