mybatisplus or关键字
时间: 2023-11-09 17:00:08 浏览: 125
MyBatis-Plus是一个为了简化MyBatis开发的增强工具,提供了许多方便的功能。其中之一就是OR关键字的使用。
在MyBatis中,我们可以使用OR关键字来实现多个条件之间的逻辑或关系。使用OR关键字可以在查询条件中添加多个条件,并且只要满足其中一个条件即可返回结果。
下面是一个使用OR关键字的示例:
```java
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 20)
.or()
.eq("gender", "female");
List<User> userList = userMapper.selectList(queryWrapper);
```
上述代码中,我们创建了一个QueryWrapper对象,并使用eq方法添加了两个条件:age等于20和gender等于"female"。在这两个条件之间使用了or方法,表示只要满足其中一个条件即可返回结果。
相关问题
mybatisplus的or用法
MybatisPlus的or用法可以通过使用`or`方法来实现。在查询条件中,如果需要使用or连接多个条件,可以使用`or`方法将这些条件包裹起来。例如,可以使用`or`方法将`eq("attr_id", key)`和`like("attr_name", key)`这两个条件连接起来。示例如下:
```java
QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>()
.eq("attr_type", "base".equalsIgnoreCase(type) ? 1 : 0)
.and(qr -> qr.eq("catelog_id", catelogId)
.or()
.eq("attr_id", key)
.like("attr_name", key)
);
```
这样生成的SQL语句会包含`OR`关键字,实现了多个条件之间的or连接。生成的SQL语句类似于:
```sql
SELECT ...
FROM ...
WHERE (attr_type = ? AND (catelog_id = ? OR attr_id = ? OR attr_name LIKE ?))
```
通过使用`or`方法,可以在MybatisPlus中灵活地使用or连接多个条件。
#### 引用[.reference_title]
- *1* *3* [Mybatis-Plus中的and()和or()的使用与原理介绍](https://blog.csdn.net/qq_43318840/article/details/125704216)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* [MybatisPlus使用or关联导致查询条件失效](https://blog.csdn.net/m0_53434091/article/details/128965335)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
mybatisplus使用or连接多组条件
### MyBatis Plus 使用 OR 连接多个查询条件
在MyBatis Plus中,可以灵活地构建复杂的SQL查询语句。对于使用`OR`连接多组查询条件的情况,可以通过`LambdaQueryWrapper`类来实现。
当需要处理多个可能为空的查询条件并希望这些条件通过`OR`逻辑组合时,可以在循环结构内部定义消费者函数,并利用`or()`方法将各个条件串联起来[^3]:
```java
if (StringUtils.isNotNull(bo.getRoomDevice()) && !bo.getRoomDevice().isEmpty()){
Consumer<LambdaQueryWrapper<MeetingRoom>> consumer = (r) -> {};
for (String roomDevice : bo.getRoomDevice()) {
Consumer<LambdaQueryWrapper<MeetingRoom>> deviceConsumer = (r) -> {
r.apply("JSON_CONTAINS(room_device, CONCAT('\"', {0}, '\"'))", roomDevice);
};
consumer = consumer.andThen(r -> r.or(deviceConsumer).or());
}
lqw.and(consumer);
}
```
上述代码片段展示了如何遍历一个设备列表并将每个设备作为单独的子查询条件加入到最终的查询表达式中去。这里的关键在于每次迭代都创建一个新的消费函数`deviceConsumer`用于封装特定于当前元素的操作;之后调用`consumer.andThen(...)`更新总的消费行为,在其中应用`.or(deviceConsumer).or()`确保不同条件下产生的SQL片段之间由`OR`关键字分隔开。
为了更清晰地理解这个过程,下面给出一段完整的示例程序说明怎样在一个实际场景下运用此技术完成基于房间设施属性(`room_device`)字段内的字符串匹配操作:
假设有一个业务对象`MeetingRoomBO`携带了一个名为`getRoomDevice()`的方法返回一组目标设备名称组成的集合。现在要找出所有满足至少含有其中一个指定设备记录的数据项,则可按照如下方式编写相应的DAO层接口实现:
```java
public List<MeetingRoom> findRoomsByDevices(MeetingRoomBO bo){
LambdaQueryWrapper<MeetingRoom> queryWrapper = new LambdaQueryWrapper<>();
if (!CollectionUtils.isEmpty(bo.getRoomDevice())){ // 判断输入参数是否有效
Consumer<LambdaQueryWrapper<MeetingRoom>> conditionBuilder = wrapper -> {};
for(String deviceName : bo.getRoomDevice()){
conditionBuilder = conditionBuilder.andThen(wrapper ->
wrapper.or(i->i.apply(
"JSON_CONTAINS(room_device,'\"' + ? + '\"')", deviceName)));
}
queryWrapper.and(conditionBuilder);
}
return meetingRoomMapper.selectList(queryWrapper);
}
```
这段代码首先验证传入的对象中的设备列表不为空,接着初始化一个空的`conditionBuilder`变量用来累积所有的查询条件。随后进入for-each循环体逐一遍历给定的设备名数组,每轮次都会扩展已有的`conditionBuilder`以增加新的分支路径——即针对某单一设备执行存在性检验的部分。最后一步则是把组装好的复合型谓词附加至主查询器实例上,从而形成预期效果。
阅读全文
相关推荐













