2016-07-21 7 views
0

Ich verwende JPA Specifications Executor, um die Suche über Datensätze basierend auf der Benutzereingabe auf der Benutzeroberfläche zu implementieren. Zum Beispiel sollte einer der Eingänge in Spalte message mit LIKE-Klausel gesucht werden. Zur Zeit habe ich es so gemacht:Wildcard-Escaping JPA-Spezifikationen

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

Das Problem ist, wenn die Eingabe des Benutzers Platzhalter wie % oder ein Text innerhalb [] enthält, werde ich nicht für sie als wörtliches suchen, aber behandeln ist als Platzhalter.

Kann mir jemand vorschlagen, wie ich dies vermeiden kann und immer nach dem wörtlichen Text in der Spalte suche, ohne jedes einzelne Zeichen im Java-Code manuell zu entfernen?

RDBS Ich benutze ist SQL Server.

Antwort

1

Sie sollten einen Parameter binden, anstatt ihn in Ihre Ausdruckszeichenfolge einzufügen.

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();