mybatisplus使用or连接多组条件
时间: 2025-05-08 07:21:09 浏览: 21
### 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`以增加新的分支路径——即针对某单一设备执行存在性检验的部分。最后一步则是把组装好的复合型谓词附加至主查询器实例上,从而形成预期效果。
阅读全文
相关推荐


















