java - 通配符转义 JPA 规范

标签 java sql-server spring spring-data-jpa

我正在使用 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/

相关文章:

java - 确保十进制数的字符串 repr 总是 n 个字符长

c# - 如何在 View 查询中找到表别名?

java - org.springframework.ui.velocity.VelocityEngineFactoryBean 发生了什么?

java - 空指针和私有(private)成员,带 swing 的基本 Java GUI

java - Spring框架-同一类型的多个ModelAttributes

Java : Java mail garbling the email-subject.

java - 如何在基于Spring Java的配置中正确使用@Inject注解?

python - 执行包含 USE 语句的批处理时出现 "Invalid cursor state"错误

sql - T-SQL 修剪 &nbsp(和其他非字母数字字符)

java - Spring注入(inject)接口(interface)实现