queryWrapper.eq多个属性
时间: 2024-10-14 08:18:20 浏览: 81
QueryWrapper 是 MyBatis-Plus 中的一个高级查询条件构建工具,它提供了一种方便的方式来构造复杂的 SQL 条件。`eq` 是其中的一个方法,用于设置等于操作,当你需要在一个对象的多个属性上应用等值匹配条件时,可以链式调用多次 `eq` 方法。
例如,假设你有一个用户对象 User,包含 id、name 和 age 等字段,你想查询所有年龄为 20 并且名字为 '张三' 的用户,你可以这样做:
```java
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("id", 20)
.eq("name", "张三");
List<User> users = userMapper.selectList(wrapper);
```
这里,`.eq("id", 20)` 表示对 id 进行等于查询,`.eq("name", "张三")` 则表示对 name 进行同样的查询。这样组合起来,MyBatis-Plus 就会生成相应的 SQL 查询语句,如:`SELECT * FROM user WHERE id = 20 AND name = '张三'`。
相关问题
queryWrapper.eq(type != null, LabelInfo::getType, type);
<think>好的,用户想了解如何正确使用MyBatis-Plus的QueryWrapper的eq方法进行条件构造。首先,我需要回忆一下MyBatis-Plus的基本用法,特别是条件构造器部分。
QueryWrapper是MyBatis-Plus中用于构建查询条件的工具,eq方法用于等值查询。用户可能需要一个具体的示例,说明如何链式调用eq方法,以及如何处理不同的字段命名规则,比如数据库中的下划线和Java对象的驼峰命名。
记得在配置文件中开启驼峰命名转换,这样MyBatis-Plus会自动处理字段名的映射。比如,数据库字段是user_name,对应的Java属性是userName,配置后不需要手动转换。需要确认用户是否已经正确配置了这个选项,这可能影响到QueryWrapper中的列名写法。
然后,应该给出一个简单的例子,比如根据姓名和年龄查询用户。代码示例需要展示如何创建QueryWrapper实例,使用eq方法添加条件,并调用selectList方法执行查询。同时,要提到如果未开启驼峰命名,可能需要使用数据库的原始列名。
可能还需要提到其他常用的条件构造方法,比如like、between等,但用户主要问的是eq方法,所以保持重点。此外,注意代码中的字段名是否正确,是否需要引号或者lambda表达式来避免硬编码。
最后,要确保回答结构清晰,分步骤说明,并引用相关的配置部分,比如配置文件中的map-underscore-to-camel-case设置,这样用户知道为什么可以直接使用Java属性名。同时,生成的相关问题应该覆盖常见的使用场景和可能遇到的问题,比如多条件组合、排序、分页等。</think>### MyBatis-Plus QueryWrapper 的 `eq` 方法使用示例
#### 1. 基本语法
`QueryWrapper` 的 `eq` 方法用于构建**等值查询条件**,语法为:
```java
eq(String column, Object val)
```
- `column`:数据库字段名(需与实体类属性名保持映射关系)
- `val`:查询条件值
#### 2. 示例代码
假设有一个 `User` 实体类,对应数据库表 `user`:
```java
@Data
public class User {
private Long id;
private String userName; // 对应数据库字段 user_name(需开启驼峰命名转换)
private Integer age;
}
```
**查询 `user_name` 为 "John" 且 `age` 为 25 的用户**:
```java
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_name", "John")
.eq("age", 25);
List<User> userList = userMapper.selectList(queryWrapper);
```
#### 3. 关键配置说明
- **驼峰命名转换**:需在 `application.yml` 中配置:
```yaml
mybatis-plus:
configuration:
map-underscore-to-camel-case: true # 开启自动转换[^1]
```
开启后,可直接使用实体类属性名(如 `userName`)替代数据库字段名(如 `user_name`)。
#### 4. 链式调用扩展
可结合其他条件方法实现复杂查询:
```java
queryWrapper.eq("user_name", "John")
.ne("status", 0) // status ≠ 0
.between("age", 20, 30);
```
QueryWrapper.lambda
### QueryWrapper 的 Lambda 表达式功能
`QueryWrapper` 提供了一个 `lambda()` 方法,可以通过该方法返回一个 `LambdaQueryWrapper` 对象[^2]。这使得开发者能够在不显式创建 `LambdaQueryWrapper` 实例的情况下,利用其类型安全的特性来构建查询条件。
以下是使用 `QueryWrapper.lambda()` 构建复杂查询条件的一个具体示例:
```java
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.Arrays;
public class Example {
public static void main(String[] args) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 调用 lambda() 方法进入 LambdaQueryWrapper 模式
queryWrapper.lambda()
.eq(User::getName, "Tom") // 类型安全地比较 name 字段等于 "Tom"
.likeRight(User::getEmail, "@gmail.com") // email 字段以 "@gmail.com" 结尾
.and(wrapper -> wrapper // 组合多个条件
.ge(User::getAge, 18) // 年龄大于等于 18 岁
.lt(User::getAge, 30)); // 并且年龄小于 30 岁
// 执行查询操作
List<User> resultList = userMapper.selectList(queryWrapper);
resultList.forEach(System.out::println);
}
}
```
#### 解析
- **`queryWrapper.lambda()`**: 进入 `LambdaQueryWrapper` 模式,允许使用实体类字段作为参数,从而实现类型安全性。
- **`.eq(User::getName, "Tom")`**: 利用 Java 的方法引用机制自动绑定 `name` 属性到数据库表中的对应列。
- **`.likeRight(User::getEmail, "@gmail.com")`**: 将 `email` 字段与模式匹配,右侧模糊匹配。
- **`.and(wrapper -> ...)`**: 支持嵌套逻辑条件,增强查询灵活性。
这种写法不仅提高了代码可读性,还减少了因硬编码字符串而导致错误的可能性。
---
### 注意事项
尽管 `QueryWrapper.lambda()` 提供了类似 `LambdaQueryWrapper` 的功能,但它本质上仍然是基于 `QueryWrapper` 的扩展[^2]。因此,在某些场景下可能无法完全替代独立使用的 `LambdaQueryWrapper`。
如果需要频繁使用 Lambda 表达式的查询方式,建议直接实例化 `LambdaQueryWrapper` 来简化开发流程[^1]。
---
阅读全文
相关推荐

















