踩坑记录MyBatis-Plus的or和and问题

Posted Code_BinBin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了踩坑记录MyBatis-Plus的or和and问题相关的知识,希望对你有一定的参考价值。

今天睡不着,打算给之前写的项目完善一下,于是我开始啪啪啪的敲代码

我在写一个模糊查询的任务,需求大致是查询我blog表里面,title字段,或者introduce字段,或者content字段包含用户输入字符,且这些结果的isdelete字段必须是no的全部可能

听上去是不是很简单,直接MyBatis-Plus的QueryWrapper走起,于是我写下了下面的查询语句

 QueryWrapper<Blog> queryWrapper=new QueryWrapper<>();
        queryWrapper.select("id","title","introduce","authorid","typeid","time","updatetime","views");
        queryWrapper.or().like("title",content)
                .or().like("introduce",content).or().like("content",content);
        queryWrapper.eq("isdelete","no");

看上去没问题,我输入空字符,按照我的需求应该是分页查询出全部isdelet字段为no的blog数据,但是,isdelete为yes的也被查出来了

仔细检查,我在sqlyog上面输入我自认为对应的sql语句,查询出来的数据是这样的

SELECT  * FROM blog WHERE title LIKE '%%'OR  introduce LIKE '%%' OR  content LIKE '%%' AND isdelete ='no'

原来如此,这样的语句是不符合业务的,业务逻辑是查询title或,introduce,content包含指定字符,且isdelete为no的数据,但是这样输入的意思是查询出title或,introduce,content包含指定字符,或者isdelete为no的数据,这样当然不行的,那么正确的语句应该是这样

SELECT  * FROM blog WHERE (title LIKE '%%'OR  introduce LIKE '%%' OR  content LIKE '%%') AND isdelete ='no'

那么,MyBatis-Plus里面对应的代码应该这样写

   queryWrapper.eq("isdelete","no");
        queryWrapper.and(  Wrapper->Wrapper.or().like("title",content)
                .or().like("introduce",content).or().like("content",content));

ok,查询成功

以上是关于踩坑记录MyBatis-Plus的or和and问题的主要内容,如果未能解决你的问题,请参考以下文章

踩坑记录MyBatis-Plus的or和and问题

MyBatis-Plus 之LambdaQueryWrapper 实现And/Or 查询

改mybatis到mybatis-plus的擎天巨坑

Mybatis-Plus自动填充功能 - 踩坑

25 mybatis-plus常用语法

Mybatis-Plus自动填充功能 - 踩坑