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

如何使用MyBatis SQL Builder生成带括号包裹的OR条件语句?

我太懂这种“明明应该很简单却卡半天”的挫败感了!你想要生成带括号包裹OR条件的SQL,其实可以通过两种常见方式实现——不管是用XML映射文件,还是用MyBatis的SQL类构建,都能搞定。

方法1:XML映射文件实现

这是最直接的方式,你可以手动写出括号结构,甚至支持动态场景:

固定场景值的写法

<select id="getByTokenAndScenes" resultType="com.yourpackage.YourEntity">
  SELECT * FROM your_table x
  WHERE x.token = #{token}
  AND (
    x.scene = 'A' OR x.scene = 'B'
  )
</select>

动态场景列表的写法(比如传入多个scene参数)

如果你的场景值是动态传入的列表,可以用<foreach>标签自动拼接OR条件,同时保留括号:

<select id="getByTokenAndScenes" resultType="com.yourpackage.YourEntity">
  SELECT * FROM your_table x
  WHERE x.token = #{token}
  AND (
    <foreach collection="sceneList" item="scene" separator=" OR ">
      x.scene = #{scene}
    </foreach>
  )
</select>

方法2:用MyBatis的SQL类构建SQL

你提到在3.4.5版本的SQL类文档里没找到相关说明,确实这个类没有专门的“分组OR”方法,但可以通过直接拼接带括号的条件字符串来实现:

固定场景值的写法

public String buildSelectSql(String token) {
  return new SQL() {{
    SELECT("*");
    FROM("your_table x");
    WHERE("x.token = #{token}");
    // 直接把带括号的OR条件作为AND的参数传入
    AND("(x.scene = 'A' OR x.scene = 'B')");
  }}.toString();
}

动态场景列表的写法

如果场景值是动态列表,手动拼接条件字符串即可:

public String buildDynamicSelectSql(String token, List<String> sceneList) {
  SQL sql = new SQL();
  sql.SELECT("*");
  sql.FROM("your_table x");
  sql.WHERE("x.token = #{token}");
  
  // 构建带括号的OR条件组
  StringBuilder conditionBuilder = new StringBuilder("(");
  for (int i = 0; i < sceneList.size(); i++) {
    if (i > 0) {
      conditionBuilder.append(" OR ");
    }
    conditionBuilder.append("x.scene = #{sceneList[").append(i).append("]}");
  }
  conditionBuilder.append(")");
  
  sql.AND(conditionBuilder.toString());
  return sql.toString();
}

其实核心就是:MyBatis允许你直接写入原生SQL片段来处理这种分组条件,官方文档没明确提确实容易让人走弯路,但这个技巧很实用。

内容的提问来源于stack exchange,提问作者Jonathan S. Fisher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:32:26