JPAで%(ワイルドカード)を含んだlike句をsetParameter()する時に少し困りました。
困った事
こんなSQLを実行したい場合。
SQL
select * from user where user.name like '%keyword%';
JPQLで書くとこんな感じになりそうですが・・・
JPQL
TypedQuery<User> query = entityManager.createQuery("SELECT u FROM User u WHERE u.name LIKE %:keyword%");
query.setParameter("keyword", keyword);
もしくは、シグルクォートで囲ってこんな感じ。
JPQL
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: %
解決策
こんな時はこうやるとうまくいきます.
JPQL
TypedQuery<User> query = entityManager.createQuery("SELECT u FROM User u WHERE u.name LIKE :keyword");
query.setParameter("keyword", "%" + keyword + "%");
さらに英語の大文字・小文字の違いも吸収したい場合は、こうします。
JPQL
TypedQuery<User> query = entityManager.createQuery("SELECT u FROM User u WHERE UPPER(u.name) LIKE UPPER(:keyword)");
query.setParameter("keyword", "%" + keyword + "%");