手っ取り早く、常に前方一致をかけて、文字数に関係なく「○○から始まる値」を検索するだけなら、以下の方法でOK。
StringBuffer hqlQuery = new StringBuffer();
hqlQuery.append("select distinct usr.id, usr.name, ");
hqlQuery.append("from Usr usr ");
hqlQuery.append("where usr.name like :selectName");
Query query = session.createQuery(hqlQuery.toString());
query.setString("selectName", this.inputData + "%");
さて、じゃあ後方一致はというと・・・普通は、
StringBuffer hqlQuery = new StringBuffer();
hqlQuery.append("select distinct usr.id, usr.name, ");
hqlQuery.append("from Usr usr ");
hqlQuery.append("where usr.name like :selectName");
Query query = session.createQuery(hqlQuery.toString());
query.setString("selectName", "%" + this.inputData);
で行けるはずなのですが・・・なぜか、今の開発環境ではうまく動かず。2byte文字だと動くけど、1byte文字だと動かなかったり、特定の文字のときだけ動かなかったりと、謎だらけです。
しかし、4時間ほど悩み続けた結果、やっと解決しました。
何のことはない、初歩的なミスというか勘違いというか。カラムを固定byteで取っていたので、桁数が足りない分は後ろがスペース埋めされてDBに格納されていたせいでした。あー、こんなことに気付かないなんて・・・(;´д⊂)
ということで、クエリーを以下のように書き換えると、問題なく後方一致検索ができるようになりました。やれやれ(苦笑)
StringBuffer hqlQuery = new StringBuffer();
hqlQuery.append("select distinct usr.id, usr.name, ");
hqlQuery.append("from Usr usr ");
hqlQuery.append("where rtrim(usr.name) like :selectName");
Query query = session.createQuery(hqlQuery.toString());
query.setString("selectName", "%" + this.inputData);
ちなみに、実環境ではinputDataの中にワイルドカードが入ってくることを想定しているので、上記のような運用はしないです。上のソースはあくまでテスト用に作ったもの、ということで(笑)
・・・しっかし、HQLで正規表現を使おうと思ったら、select文が動いたときに「where文の「~」が訳わかんねーよ!」と怒られてしまって使えず。意外と不便なのであった。
コメント