lambdaQuery 加 or

在 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
  1. 无参 or() 只"管"下一个条件,不会自动分组。
  2. 永远用 and(Consumer) / or(Consumer) 包裹组合条件,避免优先级陷阱。
  3. MyBatis-Plus 3.x 均支持 Lambda 分组,无需额外配置。
  4. 若使用 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 片段
相关推荐
DFT计算杂谈几秒前
VASP新手入门: IVDW 色散修正参数
linux·运维·服务器·python·算法
vKd0Ff21L2 分钟前
如何在Dev-C++中设置TDM-GCC为默认编译器第九十一篇
java·jvm·c++
武子康4 分钟前
Java-221 RocketMQ 消息存储核心原理:CommitLog、ConsumerQueue、IndexFile 与消息过滤机制
java·大数据·分布式·消息队列·rabbitmq·rocketmq·java-rocketmq
楼兰公子10 分钟前
《深入理解Linux网络技术内幕》配套学习大纲 + 源码Demo + 进阶实战实例
linux·arm开发·学习
北风toto11 分钟前
为什么 IntelliJ IDEA Community 无法开发 Vue?——附解决方案
java·vue.js·intellij-idea
programhelp_12 分钟前
Google 2026 New Grad SDE VO 三轮面试详解 | 含Behavioral、Coding、Design
java·服务器·数据库
驭渊的小故事16 分钟前
java中的进程的详细解析
java·开发语言
樱桃花下的小猫18 分钟前
腐蚀Rust-服务器插件模组教程
服务器·新手友好·云鸢互联·零门槛一键开服·腐蚀rust
青梅橘子皮20 分钟前
Linux---开发工具(2)(makefile、进度条、git、gdb)
linux·运维·服务器
Mr_sst24 分钟前
Codex 部署、使用教程 & Vibe Coding 实战指南
java·ai·语言模型·chatgpt·ai编程