MyBatisPlus一个关键字匹配多个列

oracle中一个关键字搜索多个列

 <select id="getList" resultType="com.cxmt.modules.vo.ServiceVo">
        SELECT si.id,si.NUMBER 
        FROM SERVICE si
        JOIN law lf ON si.FIRMID =lf.id AND lf.del_flag=0
        LEFT JOIN sys_user s ON si.USERID =s.ID AND s.DEL_FLAG =0
        <where>
            <if test="keyword != null and keyword !='' ">
                AND CONCAT(
                CONCAT(
                CONCAT(CONCAT(NVL(si.CONSULTATION_NUMBER, ''), NVL(si.DEMAND_TYPE, '')), NVL(si.MODULAR_ID, '')),
                NVL(si.SERVICE_HOURS, '')
                ), NVL(s.REALNAME, '')) like concat(concat('%',#{keyword}),'%')
            </if>
        </where>
    </select>
### 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`以增加新的分支路径——即针对某单一设备执行存在性检验的部分。最后一步则是把组装好的复合型谓词附加至主查询器实例上,从而形成预期效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值