一、基础 OR 条件
使用 or()
方法直接连接多个条件,默认在同一逻辑层内生成 OR 条件:
javaCopy Code
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getStatus, 1) .or() .eq(User::getRole, "admin");
生成 SQL:
sqlCopy Code
WHERE status = 1 OR role = 'admin'
注:or()
会将其后第一个条件与前一个条件以 OR 连接
二、嵌套 OR 条件
通过 or(Consumer<LambdaQueryWrapper> consumer)
实现逻辑分组,自动添加括号:
javaCopy Code
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getType, "A") .or(wq -> wq .eq(User::getName, "张三") .eq(User::getName, "李四") );
生成 SQL:
sqlCopy Code
WHERE type = 'A' OR (name = '张三' AND name = '李四')
注:通过 Consumer
嵌套条件,保证 OR 子句的独立性67。
三、循环中动态添加 OR 条件
遍历集合动态拼接 OR 条件时,需正确处理首次条件:
javaCopy Code
List<String> names = Arrays.asList("张三", "李四", "王五"); LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getStatus, 1); if (!names.isEmpty()) { wrapper.and(wq -> { wq.eq(User::getName, names.get(0)); // 第一个条件 for (int i = 1; i < names.size(); i++) { wq.or().eq(User::getName, names.get(i)); // 后续条件以 OR 连接 } }); }
生成 SQL:
sqlCopy Code
WHERE status = 1 AND (name = '张三' OR name = '李四' OR name = '王五')
注:需通过 and()
包裹动态 OR 条件,避免与外部条件错误组合16。
四、复杂逻辑混合 AND/OR
结合 and()
和 or()
实现多层级条件嵌套:
javaCopy Code
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getDept, "IT") .and(wq -> wq .eq(User::getAge, 30) .or() .gt(User::getSalary, 10000) );
生成 SQL:
sqlCopy Code
WHERE dept = 'IT' AND (age = 30 OR salary > 10000)
注:通过 and()
包裹内部 OR 逻辑,明确条件层级7。
常见错误及解决
-
错误连续调用
or()
javaCopy Code
wrapper.eq(A).or().eq(B).or().eq(C);
生成 SQL:
sqlCopy Code
WHERE A OR B OR C # 可能破坏外部条件逻辑
正确写法:使用
or(Consumer)
分组 -
未处理空集合
动态拼接 OR 条件时,若集合为空会导致 SQL 异常,需添加判空逻辑 -
忽略括号优先级
复杂条件需显式嵌套,避免默认优先级导致逻辑错误 -
来源于deepseek
-