起因:
最近BOSS提了个要求,在根据商品名称查询的时候,要实现去除字段空格后分页查询(虽然之前提过,但是因为太忙+没能立马实现,就耽搁了),于是今天又提到这个需求,还好不算太忙,就想着实现它。
解决过程
-
使用TRIM函数
刚开始,我第一时间想到的就是TRIM函数,模糊地记得它可以去掉字符串的空格,然后就在QueryWrapper中直接写在了like语句中。结果在测试时发现,似乎没有生效?当时就懵了个逼,啥情况?为啥和想象中的不一样?
接着就直接在数据库中查询这个TRIM(goods_name) 的执行结果:
SELECT TRIM(goods_name) FROM goods WHERE goods_status = 1;
(执行结果)
emmm
啊这?好像和想象中的完全不一样啊。
后面发现TRIM函数只能去除字段两端的空格,于是便想到了REPLACE方法来将空格替换掉
-
使用REPLACE函数
当接触REPLACE函数时,其实不太确定能不能实现在QueryWrapper中的模糊查询的,但是这次我学会了,先在Navicat中测试一遍查询结果,然后再拉入IDEA中。
SQL代码:
SELECT REPLACE(goods_name, ' ', '') FROM goods WHERE goods_status = 1;
执行结果:
看结果,应该是自己想象中的样子,于是乎,将SQL套入QueryWrapper中便成了下面这样:
queryWrapper.like("REPLACE(goods_name,' ','')", key ) .eq("goods_status", 1) .orderByAsc("id") .orderByAsc("goods_imei");
其效果也是差不多了,最终也实现了模糊查询时去掉字段空格
貌似,到这就结束了。。。。
BUT
当我想按原来的方式(加空格查询的方式)查询时,发现竟然查不到了,不过想想也是(毕竟都去掉空格查询了,再加上空格查询,似乎就白搭了),不过这样的问题还是很好解决的,就是在QueryWrapper中使用or(),然后再like 一下,就OK啦!
代码如下:
queryWrapper.like("REPLACE(goods_name,' ','')", key ) .or() .like("goods_name", key) .eq("goods_status", 1) .orderByAsc("id") .orderByAsc("goods_imei");
结尾:
这虽然看上去不咋地,其实 写出了也就那样(废话文学)。但也让我真正了解了TRIM和REPLACE的用法,继续加油吧!
Tips:
如果你想问,为什么搜索到的商品名称会这样(不区分大小写)
那就是用到了 utf8mb4_general_ci 的字符集(而不是utf8mb4_bin哦)