読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

JPQLのLIKE式で%や_を含んだ検索をする

JPA JPQL

開発が進んで、いよいよJPQLの世界にどっぷり入っていく必要がありそうです。
今の開発では、動的クエリをメインに利用する方針にしています。

間違い防止やスキーマ変更に強くするためにもCriateria APIを利用したい所ですが、業務系のシステムではクエリが複雑になるケースも多々あるため、可読性や効率性を選んで今回Criteriaは止めました(^^;

あれがゴリゴリ書ける人は本当すごいと思います。。。

さて、今日出会った小さな壁は、検索処理の際、パーセント(%)やアンダースコア(_)を含んだ検索をしたい、というものです。

例えば普通に

SELECT o FROM Opportunity o WHERE o.opportunityName LIKE '商談%'

とJPQLを書いて検索すると

商談ほにゃらら
商談hogehoge

みたいな商談名が拾えます。普通のLIKE式です。

で、今回は以下のような商談名があった場合

この商談は駄目確率0%
100%上手くいく商談

検索で「0%」を含むやつ、とか、「100%」で始まる、とか検索したい、みたいな。

金魚本みたのですが情報はなく、今回は珍しく色々ググる前にJSRをみてみました(^^;
http://jcp.org/en/home/index

JPAのspecの中にLike Expressionsのページがあり、かなりわかりやすい例でExamplesがあって、すぐ解決しました。

SELECT o FROM Opportunity o WHERE o.opportunityName LIKE '%0\%' ESCAPE '\'
SELECT o FROM Opportunity o WHERE o.opportunityName LIKE '100\%%' ESCAPE '\'

f:id:kikutaro777:20130228230745j:plain
f:id:kikutaro777:20130228230752j:plain
上記ウィンドウはNetBeans 7.3から入ったJava Persistence JPQL testing toolの結果ウィンドウです。これがあるとないでは開発効率に差が出る気がします(^^;
過去エントリで少し触れています→「NetBeans7.3で嬉しかったこと!

エスケープでいける、ってことで通常のSQLと大差ない感じのようです。
上記例は、%のみですが、アンダースコア(_)も同じです。

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村