踩坑记录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问题的主要内容,如果未能解决你的问题,请参考以下文章