JPAで%(ワイルドカード)を含んだlike句をsetParameterする

JPAで%(ワイルドカード)を含んだlike句をsetParameter()する時に少し困りました。


困った事

こんなSQLを実行したい場合。

select * from user where user.name like '%keyword%';

JPQLで書くとこんな感じになりそうですが・・・

TypedQuery<User> query = entityManager.createQuery("SELECT u FROM User u WHERE u.name LIKE %:keyword%");
query.setParameter("keyword", keyword);

もしくは、シグルクォートで囲ってこんな感じ。

TypedQuery<User> query = entityManager.createQuery("SELECT u FROM User u WHERE u.name LIKE '%:keyword%'");
query.setParameter("keyword", keyword);

どちらも実行すると下記のようなエラーが出てしまいます・・・

ERROR o.h.hql.internal.ast.ErrorCounter - line 1:109: unexpected token: % 
antlr.NoViableAltException: unexpected token: %

解決策

こんな時はこうやるとうまくいきます.

TypedQuery<User> query = entityManager.createQuery("SELECT u FROM User u WHERE u.name LIKE :keyword");
query.setParameter("keyword", "%" + keyword + "%");

さらに英語の大文字・小文字の違いも吸収したい場合は、こうします。

TypedQuery<User> query = entityManager.createQuery("SELECT u FROM User u WHERE UPPER(u.name) LIKE UPPER(:keyword)");
query.setParameter("keyword", "%" + keyword + "%");