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 列表中,并最终用于构建查询条件