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 + "%");