lambdaQueryWrapper or条件加括号
时间: 2025-07-05 09:08:08 浏览: 19
在 MyBatis-Plus 中,使用 `LambdaQueryWrapper` 构建复杂查询条件时,若需要为 `OR` 条件添加括号(例如 `(A OR B) AND C`),可以通过 **嵌套 `or()` + `nested()`** 或 **`and(wrapper -> wrapper.or())`** 实现。以下是具体方法和示例:
---
### **方法 1:使用 `nested()` 嵌套 `or()`**
通过 `nested()` 方法显式包裹 `or()` 条件,确保括号分组:
```java
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.nested(w -> w.eq(User::getName, "Alice").or().eq(User::getName, "Bob"))
.eq(User::getAge, 25);
```
**生成的 SQL**:
```sql
WHERE (name = 'Alice' OR name = 'Bob') AND age = 25
```
---
### **方法 2:使用 `and(wrapper -> wrapper.or())`**
通过 `and()` 结合 Lambda 表达式嵌套 `or()`:
```java
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.and(w -> w.eq(User::getName, "Alice").or().eq(User::getName, "Bob"))
.eq(User::getAge, 25);
```
**生成的 SQL**:
```sql
WHERE (name = 'Alice' OR name = 'Bob') AND age = 25
```
---
### **方法 3:多级嵌套(复杂括号分组)**
若需多层括号(如 `A OR (B AND C)`):
```java
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getStatus, 1)
.or(w -> w.eq(User::getName, "Alice")
.nested(w2 -> w2.eq(User::getAge, 25).eq(User::getGender, 1)));
```
**生成的 SQL**:
```sql
WHERE status = 1 OR (name = 'Alice' AND (age = 25 AND gender = 1))
```
---
### **关键点总结**
1. **`nested()`**:显式包裹条件,生成括号。
2. **`and(wrapper -> wrapper.or())`**:通过 Lambda 表达式嵌套 `or()`,逻辑更清晰。
3. **避免歧义**:复杂条件建议使用 `nested()` 明确分组,防止 SQL 逻辑错误。
---
### **常见问题**
#### **Q1:直接链式调用 `or()` 会怎样?**
```java
wrapper.eq(User::getName, "Alice").or().eq(User::getName, "Bob").eq(User::getAge, 25);
```
**生成的 SQL**:
```sql
WHERE name = 'Alice' OR name = 'Bob' AND age = 25 -- 实际等价于 name = 'Alice' OR (name = 'Bob' AND age = 25)
```
**问题**:`OR` 和 `AND` 的优先级可能导致逻辑与预期不符,需用 `nested()` 明确分组。
#### **Q2:如何实现 `(A OR B) OR (C AND D)`?**
```java
wrapper.or(w -> w.nested(w2 -> w2.eq(User::getName, "Alice").or().eq(User::getName, "Bob")))
.or(w -> w.nested(w2 -> w2.eq(User::getAge, 25).eq(User::getGender, 1)));
```
**生成的 SQL**:
```sql
WHERE (name = 'Alice' OR name = 'Bob') OR (age = 25 AND gender = 1)
```
---
### **总结**
- **括号分组**:优先使用 `nested()` 或 `and(wrapper -> wrapper.or())` 明确逻辑。
- **复杂条件**:多层嵌套时,逐层用 `nested()` 包裹。
- **验证 SQL**:通过日志或调试模式检查生成的 SQL 是否符合预期。
---
阅读全文
相关推荐




















