mybatis-plus的QueryWrapper的or方法如何对字段进行切割,并对处理后的字段使用like
时间: 2024-02-17 22:01:52 浏览: 104
Mybatis-plus的QueryWrapper的or方法可以通过使用Lambda表达式来对字段进行切割,并对处理后的字段使用like进行模糊查询。Lambda表达式可以使用QueryWrapper类中的静态方法来对字段进行切割操作,同时可以使用like方法进行模糊查询,例如:
```java
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.or(i -> i.eq("age", 18).or().apply("SUBSTR(name,1,3)={0}", "Tom").apply("SUBSTR(email,1,3) LIKE {0}", "%test%"));
List<User> userList = userMapper.selectList(wrapper);
```
上述代码中,Lambda表达式中使用了eq方法来判断年龄是否等于18,同时使用了apply方法来对name字段进行SUBSTR函数操作,获取其前三个字符,判断是否等于"Tom"。接着,又使用了apply方法来对email字段进行SUBSTR函数操作,获取其前三个字符,并使用LIKE操作符进行模糊查询,判断是否包含"test"。其中,apply方法可以接受一个SQL表达式,用于对字段进行切割操作,LIKE操作符可以接受一个字符串,用于进行模糊查询。
相关问题
mybatis-plus的QueryWrapper的or方法如何对字段进行切割,并使用like
Mybatis-plus的QueryWrapper的or方法可以通过使用Lambda表达式来对字段进行切割,并使用like进行模糊查询。Lambda表达式可以使用QueryWrapper类中的静态方法来对字段进行切割操作,同时可以使用like方法进行模糊查询,例如:
```java
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.or(i -> i.eq("age", 18).or().apply("SUBSTR(name,1,3)={0}", "Tom").like("email", "test"));
List<User> userList = userMapper.selectList(wrapper);
```
上述代码中,Lambda表达式中使用了eq方法来判断年龄是否等于18,同时使用了apply方法来对name字段进行SUBSTR函数操作,获取其前三个字符,判断是否等于"Tom"。接着,使用了like方法来对email字段进行模糊查询,判断是否包含"test"。其中,apply方法可以接受一个SQL表达式,用于对字段进行切割操作,like方法可以接受一个字符串,用于进行模糊查询。
mybatis-plus 自定义QueryWrapper
在 MyBatis-Plus 中,`QueryWrapper` 是一个用于构建动态查询条件的工具类,它支持链式调用,能够灵活地组合查询条件,尤其适合复杂查询场景。通过自定义 `QueryWrapper`,可以实现对 SQL 查询条件的封装和复用,提高代码的可读性和可维护性。
### 自定义 QueryWrapper 的基本使用
1. **基础查询条件构建**
可以通过 `QueryWrapper` 或 `LambdaQueryWrapper` 来构建查询条件。`LambdaQueryWrapper` 使用方法引用的方式构建条件,避免字段名拼写错误,提升代码可读性。
```java
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName, "Tom")
.ge(User::getAge, 20)
.like(User::getEmail, "example.com");
List<User> users = userMapper.selectList(wrapper);
```
2. **字段选择与分组查询**
在某些场景下,只需要查询特定字段或进行分组统计操作,可以通过 `select` 方法指定需要查询的字段,并结合 `groupBy` 实现分组查询。
```java
LambdaQueryWrapper<Order> wrapper = new LambdaQueryWrapper<>();
wrapper.select(Order::getCustomerId, Order::getTotalAmount)
.eq(Order::getStatus, 1)
.groupBy(Order::getCustomerId);
List<Order> orders = orderMapper.selectList(wrapper);
```
3. **嵌套条件与复杂查询**
对于需要使用括号包裹的嵌套查询条件,可以通过 `and` 和 `or` 方法进行组合。
```java
LambdaQueryWrapper<Order> wrapper = new LambdaQueryWrapper<>();
wrapper.and(w -> w.eq(Order::getStatus, 1).ge(Order::getAmount, 100))
.or()
.eq(Order::getType, 2);
List<Order> orders = orderMapper.selectList(wrapper);
```
4. **动态 SQL 与自定义 SQL 片段**
在 XML 映射文件中,可以使用 `${ew.customSqlSegment}` 注入 `Wrapper` 构建的 SQL 条件片段,实现更灵活的 SQL 拼接。
```xml
<select id="customSelect" resultType="User">
SELECT * FROM user
<where>
${ew.customSqlSegment}
</where>
</select>
```
在 Java 代码中调用时,传入自定义的 `Wrapper`:
```java
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getAge, 25).like(User::getName, "J");
List<User> users = userMapper.customSelect(wrapper);
```
5. **聚合函数与统计查询**
如果需要使用聚合函数(如 `MIN`、`MAX`、`COUNT` 等),可以结合 `selectObjs` 或 `selectList` 实现,虽然 `QueryWrapper` 并不直接支持 lambda 表达式来指定聚合字段。
```java
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("MIN(age) as minAge", "MAX(age) as maxAge")
.groupBy("sex");
List<Map<String, Object>> result = userMapper.selectMaps(wrapper);
```
### 适用场景
- **简单查询**:适用于字段等值匹配、范围查询等。
- **多条件组合查询**:适用于动态条件筛选,如后台管理系统的条件搜索。
- **分组统计查询**:适用于数据报表、统计分析等场景。
- **复杂嵌套查询**:适用于多条件逻辑组合,如 `(A AND B) OR (C AND D)` 类型查询。
通过合理使用 `QueryWrapper`,可以显著减少手动编写 SQL 的工作量,同时提升代码的可读性和可维护性。对于更复杂的 SQL 逻辑,可以结合 XML 映射文件或注解方式实现更精细的控制。
---
阅读全文
相关推荐


















