我正在使用JPA规范执行程序根据用户在UI上的输入通过记录实现搜索。
例如,应使用LIKE子句在列message
中搜索其中一个输入。目前我这样做了:
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。
答案 0 :(得分: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();