我正在使用 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。
最佳答案
您应该绑定(bind)一个参数,而不是将其插入到表达式字符串中。
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();
关于java - 通配符转义 JPA 规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38500399/