我正在使用https://www.baeldung.com/rest-api-search-language-rsql-fiql处的指南来构建基于RSQL的JPA规范。
like子句如下所示:
return builder.like(root.get(property), argument.toString().replace('*', '%'));
我的问题是,处理用户输入中转义特殊字符的最佳方法是什么?
例如,如果用户提供了字符串:
*my-search%-term*
上面的代码会将其翻译为:
%my-search%-term%
我想对字符串中的%
进行转义,以便在LIKE子句中不将其评估为%
通配符。
以下文章陈述了每个数据库的LIKE特殊字符:
List of special characters for SQL LIKE clause
并且还要注意答案之一中的comment:
这里不可能编写独立于DBMS的代码,因为您不会知道您将要转义哪些字符,以及标准说你无法逃避不需要逃避的事情。 (看到第8.5节/一般规则/3.a.ii。)]
我想知道解决这个问题的最佳方法是什么?我在生产中使用了postgres,在测试中使用了h2,但理想情况下不希望将解决方案与这两个方法绑定在一起。
为什么不使用正则表达式匹配而不是like
?
where col ~ <user input>
听起来您的用户可能对正则表达式更为熟悉。
如果您只想忽略所有通配符功能的完全匹配,则可以使用位置:
where position(<user input> in col) > 0
在标准SQL中,您只需要转义%
和_
字符,因为这些字符是LIKE
运算符支持的唯一通配符。
因此*my-search%-term*
应该在SQL中像这样使用
WHERE some_column LIKE '%my-search\%-term%' escape '\'