続・大文字小文字区別なし検索
昨日の記述が間違っていたので修正しました
さてさて、大文字小文字の区別なし検索の続き。
外出しで解決するとどうなる?というわけで、外出しの勉強も兼ねて実験。
元となるSQLは、ログから拝借。
(これは、解説でも書いてありますね。
出来るところまで、CondtionBeanでやってからでも流用できるのでいいよ〜と(あいまいな記憶))
ちなみに、autoPagingが指定できるといったのが決め手。
出来ないというのであれば、試そうともしなかっただろうなぁ・・・・
というわけで、サンプルを見て、コメントを追加していく。
うむ・・・テキストエディタだと厳しい・・・ZigenPluginの出番ですね。
ちなみに、ConditionBeanでのロジックで指定しているLikeSearchOptionは以下の通り。
new LikeSearchOption().likeContain().escapeByPipeLine().splitBySpace().toLowerCase();
外出しSQLだと、like検索にて、splitByXXXが利用できないとの事。
ということで、じゃぁ・・複数渡したい場合はどうするのさ??
埋め込み変数コメントを利用して、その辺りをどかんと投入か・・・
と思ったけど、escapeとか面倒な気がする。
んで、基本的には、andでつなげて良いので、
like検索用の変数を3つ位設けてしまおう。(必要であれば、20個でも、30個でも)
-- !!String name1:like!! -- !!String name2:like!! -- !!String name3:like!! /*IF pmb.name1 != null*/and LOWER(dflocal.name) like LOWER(/*pmb.name1*/ '%F%') escape '|'/*END*/ /*IF pmb.name2 != null*/and LOWER(dflocal.name) like LOWER(/*pmb.name2*/ '%F%') escape '|'/*END*/ /*IF pmb.name3 != null*/and LOWER(dflocal.name) like LOWER(/*pmb.name3*/ '%F%') escape '|'/*END*/
こんな感じで。
しかしname1とかに値を入れていくのが、面倒な気がする。(特に数を増やした場合。)
どうせならループでやりたい。
そんでもって、どうやら
name.key1
name.key2
とかでMapのKeyを指定して値がとれる拡張がしてあるとの事なのでそっちをためしてみる。
ちなみに、上記にすると、右辺に関して、escape構文含めてLOWERで括られてしまうので、エラーとなる
なので、実際はロジック側で小文字なりにする必要がある。
また、escape構文が解釈されてしまうので、escapeByオプションを利用すると、
escape '|' escape '|'
となる。なので、テスト値のほうには、escapeは入れないべき。(意図を伝えるためにあえて入れてあるけど)
注釈が長くなったが、以下実験。(上記注釈は引きずります。)
<<SQL>> -- !!java.util.Map names:like!! /*IF pmb.names != null*/ /*IF pmb.names.key0 != null */and LOWER(dflocal.name) like LOWER(/*pmb.names.key0*/'%F%') escape '|'/*END*/ /*IF pmb.names.key1 != null */and LOWER(dflocal.name) like LOWER(/*pmb.names.key1*/'%F%') escape '|'/*END*/ /*IF pmb.names.key2 != null */and LOWER(dflocal.name) like LOWER(/*pmb.names.key2*/'%F%') escape '|'/*END*/ /*END*/ <<LOGIC>> String[] params = condition.getConditionName().split(" "); for (int i = 0; i < params.length; i++) { map.put("key" + i, params[i]);//LOWER使わないなら toLowerCase } pmb.setNames(map, likeSearchOption);
あれですね。
Mapの場合、LikeのescapeByオプションは効かないようです。(むしろLikeSearchOption全滅)
なので、テスト値のつもりで入れておいた、escape '|'が解釈されるのを利用するという手もあるかもしれません。
//全角スペースを同一視 String[] params = condition.getConditionName().replace(' ', ' ').split(" "); for (int i = 0; i < params.length; i++) { map.put("key" + i, "%" + params[i].replaceAll("\\%", "|%") + "%"); } pmb.setNames(map, likeSearchOption); //↑ //このlikeSearchOptionが、mapの各Valueに対して適応されないんだよね・・・
というわけで、
- Mapを利用せず、地味に各String型の変数に値を詰め込んで行ってみる(ループを使わない。もしくはリフレクションと合わせて使う)
- エスケープは自前で行うので、Mapを利用しちゃう。
- ソースをいじる。
- 駄目元で改善要望を出してみる。(私的には不自由してないので構いませんが・・・)
などなどではないでしょうか。