在 MyBatis-Plus 中,LambdaQueryWrapper 的 .or() 用于拼接 SQL 的 OR 条件。核心难点在于条件优先级与括号分组,使用不当会导致 SQL 逻辑与预期不符。
🔹 1. 基础用法(仅作用于下一个条件)
lambdaQuery()
.eq(User::getName, "Alice")
.or() // ⚠️ 只影响紧随其后的一个条件
.eq(User::getAge, 25)
.list();
// 生成 SQL: WHERE name = 'Alice' OR age = 25
🔹 2. 推荐用法:使用 Lambda 分组(自动加 ())
当需要 AND (A OR B) 或 OR (A AND B) 时,务必使用 and(Consumer) / or(Consumer),框架会自动处理括号。
lambdaQuery()
.eq(User::getStatus, 1)
.and(wrapper -> wrapper // 生成外层 AND (...)
.eq(User::getName, "Alice")
.or()
.eq(User::getAge, 25)
)
.list();
// 生成 SQL: WHERE status = 1 AND (name = 'Alice' OR age = 25)
🔹 3. 复杂多条件 OR 示例
lambdaQuery()
.eq(User::getStatus, 1)
.or(wrapper -> wrapper // 生成 OR (...)
.like(User::getName, "张")
.or() // 括号内部的 OR
.like(User::getName, "李")
)
.list();
// 生成 SQL: WHERE status = 1 OR (name LIKE '%张%' OR name LIKE '%李%')
⚠️ 关键注意事项
| 写法 | 生成 SQL | 是否推荐 |
|---|---|---|
.eq(A).or().eq(B).eq(C) |
WHERE A OR B AND C |
❌ 易错,AND 优先级高于 OR |
.eq(A).or(wrapper->wrapper.eq(B).eq(C)) |
WHERE A OR (B AND C) |
✅ 安全明确 |
连续多个 .or() |
WHERE A OR B OR C |
✅ 仅限纯并列 OR |
- 无参
or()只"管"下一个条件,不会自动分组。 - 永远用
and(Consumer)/or(Consumer)包裹组合条件,避免优先级陷阱。 - MyBatis-Plus 3.x 均支持 Lambda 分组,无需额外配置。
- 若使用
service.lambdaQuery(),底层自动构建LambdaQueryWrapper,写法完全一致。
💡 调试技巧
生成 SQL 前可打印 Wrapper 确认逻辑:
LambdaQueryWrapper<User> wrapper = Wrappers.<User>lambdaQuery()
.eq(User::getStatus, 1)
.and(w -> w.eq(User::getName, "Alice").or().eq(User::getAge, 25));
System.out.println(wrapper.getSqlSegment()); // 查看实际 SQL 片段