详细分析MybatisPlus中 多个like的模糊匹配查询

前言

对于MybatisPlus的相关知识推荐阅读:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 【Java项目】实战CRUD的功能整理(持续更新)
  3. MyBatis-plus从入门到精通(全)

1. 基本知识

模糊字段值 再拼接 另外模糊字段值

一般SQL语句如下:

SELECT * FROM table_name 
WHERE field1 LIKE '%keyword1%' OR field2 LIKE '%keyword2%';

相应的Java代码如下:

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("field1", "keyword1").or().like("field2", "keyword2");

// 然后你可以使用该queryWrapper进行其他操作,比如执行查询:
List<User> userList = userDao.selectList(queryWrapper);

如果还有其他的字段值拼接,java语句如下:

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("field1", "keyword1")
    .or()
    .like("field2", "keyword2")
    .and(wrapper -> wrapper.eq("is_deleted", 0));

// 然后你可以使用该queryWrapper进行其他操作,比如执行查询:
List<User> userList = userDao.selectList(queryWrapper);

2. 实战补充

基础知识讲解的是 一个模糊字段值 拼接 另外一个模糊字段值

问题所示:
在实战中是 一个模糊字段值 拼接 相同模糊字段值 等
(前端 为多选的形式 或者 数组的方式传递给后端)

作为后端需要相应处理这个字段值的模糊查询(相同字段多个模糊值 之后 合并查询值)

一开始的代码如下:

if (!StringHelper.isNullOrEmptyString(model)) {

	// 处理模型的查询,前端传输过来的是数组,对应预处理并传递给后端
	String[] models = model.split("-");

	for (String selectedModel : models) {
	
		if ("码农".equals(selectedModel)) {
			// 查询码农的设备信息
			List<Info> infos = infoService.list(new QueryWrapper<Info>().eq("model", CommonConstant.EQUIPMENT_LIGHT_BRIDGE));
			if (!infos.isEmpty()) {
				wrapper.or(i -> i.in("equipment_no", infos.stream().map(Info::getEquipmentNo).collect(Collectors.toList())));
			}
		} else if ("研究僧".equals(selectedModel)) {
			// 查询研究僧的设备信息
			List<Info> infos = infoService.list(new QueryWrapper<Info>().eq("model", CommonConstant.EQUIPMENT_MODEL_QUAYSIDE));
			if (!infos.isEmpty()) {
				wrapper.or(i -> i.in("equipment_no", infos.stream().map(Info::getEquipmentNo).collect(Collectors.toList())));
			}
		} else {
			// 其他情况下,模糊匹配设备编号
			wrapper.or(i -> i.like("equipment_no", selectedModel + "%"));
		}
	}
}

// 其他条件的过滤,类似如下:
wrapper.eq("status",0);
wrapper.orderByDesc("update_time");

类似上述代码
出现的BUG如下:

将其模糊查询所有的值进行合并,且不会顾及其他各个字段值,输出的结果肯定不是想要的结果

如果将or改为and,那么数值只有一个的时候会满足,多个数值一起就不满足了!!

如果模糊查询到的值,每一次都将其各个其他字段值相应过滤,这样处理的速度比较慢,且不好看懂

写在最后,如果处理同个数据值 多个模糊查询,不应该使用or 的方式进行拼接

将其满足的字段值放在一个列表,最终对列表进行过滤!

改变查询方式以获取全部数据,考虑使用一个新的 List 或者其他集合类型来保存查询到的数据值,然后将其用于构建查询条件

代码如下:

if (!StringHelper.isNullOrEmptyString(model)) {
     // 处理模型的查询
     String[] models = model.split("-");

     for (String selectedModel : models) {
         if ("码农".equals(selectedModel)) {
             // 查询农的设备信息
             List<Info> infos = infoService.list(new QueryWrapper<Info>().eq("model", CommonConstant.EQUIPMENT_LIGHT_BRIDGE));
             if (!infos.isEmpty()) {
                 matchedEquipmentNos.addAll(infos.stream().map(Info::getEquipmentNo).collect(Collectors.toList()));
             }
         } else if ("研究僧".equals(selectedModel)) {
             // 查询研究僧的设备信息
             List<Info> infos = infoService.list(new QueryWrapper<Info>().eq("model", CommonConstant.EQUIPMENT_MODEL_QUAYSIDE));
             if (!infos.isEmpty()) {
                 matchedEquipmentNos.addAll(infos.stream().map(Info::getEquipmentNo).collect(Collectors.toList()));
             }
         } else {
             // 其他情况下,模糊匹配设备编号
             // 添加模糊匹配条件
             wrapper.or(i -> i.like("equipment_no", selectedModel + "%"));
         }
     }
}

// 将所有匹配的设备编号用于构建查询条件
if (!matchedEquipmentNos.isEmpty()) {
    wrapper.in("equipment_no", matchedEquipmentNos);
}

这种方式,无论是通过设备编号查询还是通过模型查询,都会将匹配的设备编号保存在 matchedEquipmentNos 列表中,并最终用于构建查询条件

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值