2016-07-21 19 views
0

JPA仕様Executorを使用して、ユーザーのUI入力に基づいてレコードを検索します。 たとえば、入力の1つはLIKE句を使用して列messageで検索する必要があります。現在、私はこのようにそれを行っている:JPA仕様をエスケープするワイルドカード

if (StringUtils.isNotBlank(searchOptions.getSearchString())) { 
    String likeExpression = String.format("%%%s%%", searchOptions.getSearchString()); 
    specifications = specifications.and(
     (root, query, cb) -> cb.like(root.get("message"), likeExpression)); 
} 

問題は、ユーザーの入力が[]内部%または一部のテキストのようなワイルドカードが含まれている場合リテラルが、御馳走がワイルドカードとしてであるように、私はそれを検索しません、です。

誰も私にこれを避ける方法を教えてもらえますか?そして、Javaコード内のそのような文字をすべて手動でエスケープする必要なしに、列のリテラルテキストを常に検索してください。

RDBS私はSQL Serverを使用しています。

答えて

1

パラメータを式文字列に挿入するのではなく、バインドする必要があります。

CriteriaQuery<Person> criteria = build.createQuery(Person.class); 
Root<Person> personRoot = criteria.from(Person.class); 
criteria.select(personRoot); 
ParameterExpression<String> eyeColorParam = builder.parameter(String.class); 
criteria.where(builder.equal(personRoot.get(Person_.eyeColor), eyeColorParam)); 
TypedQuery<Person> query = em.createQuery(criteria); 
query.setParameter(eyeColorParam, "brown"); 
List<Person> people = query.getResultList();