IBATIS查询指定列包含精确匹配字符串的参数传值问题
问题原因
你的代码失效核心是多层转义冲突:Java字符串、MyBatis注解解析、PostgreSQL SQL语法三层都需要对反斜杠\做转义,你原来只写了2个反斜杠,最终传递到数据库的正则表达式会丢失反斜杠,单词边界\y失效,无法匹配完整单词。
修复方案
- 方案1:修改注解SQL的转义位数
直接在注解内完成拼接,把单词边界的反斜杠改成4个,确保最终传递到数据库的是有效的\y:
@Select("SELECT * from table where column_name ~* '\\\\y' || #{valuePassedFromMethod} || '\\\\y'") List<String> methodName(@Param("valuePassedFromMethod") String valuePassedFromMethod);
如果仍不生效,可以加PostgreSQL转义字符串前缀E明确声明转义规则:
@Select("SELECT * from table where column_name ~* E'\\\\y' || #{valuePassedFromMethod} || E'\\\\y'") List<String> methodName(@Param("valuePassedFromMethod") String valuePassedFromMethod);
- 方案2:Java层拼接正则(更稳妥,不易出错)
把单词边界的拼接逻辑放到业务代码层处理,不需要处理多层转义,SQL更简洁:
- 调用方法前拼接参数:
// 拼接带单词边界的正则串,只需要处理Java层单次转义 String searchParam = "\\y" + 你的搜索关键词 + "\\y"; // 调用DAO方法 methodName(searchParam);
- 简化DAO层注解:
@Select("SELECT * from table where column_name ~* #{valuePassedFromMethod}") List<String> methodName(@Param("valuePassedFromMethod") String valuePassedFromMethod);
两种方案都可以实现你的需求:搜索create/query时匹配到x = "create query"的记录,搜索子串reate/uer时无返回结果。
内容的提问来源于stack exchange,提问作者Razvan
相关产品推荐
相关产品推荐

