如何使用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
相关产品推荐
相关产品推荐

