当前位置:   article > 正文

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

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%';
  • 1
  • 2

相应的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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

如果还有其他的字段值拼接,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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

类似上述代码
出现的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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/732993
推荐阅读
相关标签
  

闽ICP备14008679号