データサイエンティスト基礎講座

[Hibernate] カラムの値をあいまい検索する方法

手っ取り早く、常に前方一致をかけて、文字数に関係なく「○○から始まる値」を検索するだけなら、以下の方法で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文の「~」が訳わかんねーよ!」と怒られてしまって使えず。意外と不便なのであった。

スポンサーリンク

この記事をシェア

アカウントをフォロー