dbfluteで大文字小文字の区別をなしにしたLIKE検索
// new LikeSearchOption().toLowerCase() --> 小文字に変換して比較
// new LikeSearchOption().toUpperCase() --> 大文字に変換して比較
これって、
HOGE LIKE LOWER('%PARAM%')
なのね・・・
理想は
LOWER(HOGE) LIKE LOWER('%PARAM%')
なんだけど・・・
もしくは、ignoreCaseみたいなメソッドによって上記動作が可能とか。
・・・これだけの為に外出しか!?
もうちょい調査。
かんたんだったらdbfluteでつくったソースを上書き。(exパッケージでどうにかなるなら・・・ね)
追加
やはり出来ないようだ。
それで、修正だが、そうかんたんには出来なかった・・・・
一応以下追加で私の検索が想定どおり動くのを確認。
JOINした場合で子テーブルに対してのLikeなどで、
不具合起こったりするかも知れないけど、
まぁ自分環境では問題ないのでいいや。
結果として、以下のようなSQLとなる。
where LOWER(dflocal.NAME) like '%param%' escape '|'
本来であれば、
where LOWER(dflocal.NAME) like LOWER('%pARam%') escape '|'
の方がよさげなんだけど・・・
というかそもそも
generate.bat
実行されたらうわがかれてしまうんだけどねぇ・・・
それがいやなら、vmを上書きで。
共通部分なので、上書きは決して難しくはない。(すべて固定文字だしね。)
・・・が保証の限りではない。
(もっとも保証出来る記述なんて一切ないんだが・・・)
一応そんな理由もあり、ignoreCaseなんてオプションを追加するのをやめて、
簡単に修正できそうな、toUpper toLowerの挙動を変えるという方向で修正してみた。
修正箇所
vmの修正もほぼ同様です。
しつこいようだが、二次的な副作用が出るかも知れません。
allcommon/cbean/ckey/ConditionKeyLikeSearch.java
doAddWhereClause(line66付近)
final LikeSearchOption myOption = (LikeSearchOption)option; //add start columnName = myOption.getColNameWithConvert(columnName); //add end conditionList.add(buildBindClauseWithRearOption(columnName, value.getLikeSearchLocation(), myOption.getRearOption()));
allcommon/cbean/coption/parts/ToUpperLowerCaseOptionParts.java
method 追加
値に関するクラスなので、微妙だけど・・・・
//add start public String generateColName(String colName) { if (colName == null) { return colName; } // To Upper/Lower Case if (_toUpperCase) { colName = (colName != null ? "UPPER(" + colName + ")" : colName); } if (_toLowerCase) { colName = (colName != null ? "LOWER(" + colName + ")" : colName); } return colName; } //add end
20088624一部記述に誤りがあり、修正しました。
UPPER()等でくくるところを、
colName.toUpperCase()
等にしていた。簡単なコピペ間違いだったんですが、
なんかそれっぽいだけにチェック漏れました・・・
allcommon/cbean/coption/LikeSearchOption.java
//add start public String getColNameWithConvert(String colName) { if(_toUpperLowerCaseOptionParts != null) { colName = _toUpperLowerCaseOptionParts.generateColName(colName); } return colName; } //add end