You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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更简洁:
  1. 调用方法前拼接参数:
// 拼接带单词边界的正则串,只需要处理Java层单次转义
String searchParam = "\\y" + 你的搜索关键词 + "\\y";
// 调用DAO方法
methodName(searchParam);
  1. 简化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:57:03