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

您所在的位置:网站首页 模糊匹配多个关键字怎么设置 详细分析MybatisPlus中 多个like的模糊匹配查询

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

2024-07-16 08:27| 来源: 网络整理| 查看: 265

目录 前言1. 基本知识2. 实战补充

前言

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

java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新)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 queryWrapper = new QueryWrapper(); queryWrapper.like("field1", "keyword1").or().like("field2", "keyword2"); // 然后你可以使用该queryWrapper进行其他操作,比如执行查询: List userList = userDao.selectList(queryWrapper);

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

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.like("field1", "keyword1") .or() .like("field2", "keyword2") .and(wrapper -> wrapper.eq("is_deleted", 0)); // 然后你可以使用该queryWrapper进行其他操作,比如执行查询: List userList = userDao.selectList(queryWrapper); 2. 实战补充

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

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

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

一开始的代码如下:

if (!StringHelper.isNullOrEmptyString(model)) { // 处理模型的查询,前端传输过来的是数组,对应预处理并传递给后端 String[] models = model.split("-"); for (String selectedModel : models) { if ("码农".equals(selectedModel)) { // 查询码农的设备信息 List infos = infoService.list(new QueryWrapper().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 infos = infoService.list(new QueryWrapper().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 infos = infoService.list(new QueryWrapper().eq("model", CommonConstant.EQUIPMENT_LIGHT_BRIDGE)); if (!infos.isEmpty()) { matchedEquipmentNos.addAll(infos.stream().map(Info::getEquipmentNo).collect(Collectors.toList())); } } else if ("研究僧".equals(selectedModel)) { // 查询研究僧的设备信息 List infos = infoService.list(new QueryWrapper().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 列表中,并最终用于构建查询条件



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3