【Mybatis Plus】QueryWrapper 拼接 or()、and()、like() 时条件匹配不全坑点

背景

查询参数如下:

在这里插入图片描述


问题描述

查询条件只匹配了serachText = "1"这一条件,其他均匹配失败。

QueryWrapper拼接语句如下:

// 拼接查询条件 省略了从WorkQueryRequest的getXxx步骤
if (StringUtils.isNotBlank(searchText)) {
    queryWrapper.like("title", searchText).or().like("description", searchText);
}
queryWrapper.eq(ObjectUtils.isNotEmpty(id), "id", id);
queryWrapper.like(StringUtils.isNotBlank(title), "title", title);
queryWrapper.eq(StringUtils.isNotBlank(workType), "workType", workType);
queryWrapper.eq(ObjectUtils.isNotEmpty(creatorId), "creatorId", creatorId);
queryWrapper.eq(ObjectUtils.isNotEmpty(status), "status", status);
queryWrapper.ge(ObjectUtils.isNotEmpty(minPrice), "total", minPrice);
queryWrapper.le(ObjectUtils.isNotEmpty(maxPrice), "total", maxPrice);

通过debug:该SQL语句为(控制台输出结果)

 WHERE (title LIKE #{ew.paramNameValuePairs.MPGENVAL1} OR description LIKE #{ew.paramNameValuePairs.MPGENVAL2} AND workType = #{ew.paramNameValuePairs.MPGENVAL3} AND status = #{ew.paramNameValuePairs.MPGENVAL4} AND isDelete = #{ew.paramNameValuePairs.MPGENVAL5}) ORDER BY favorCount DESC

简略版

WHERE (title LIKE #{...} OR description LIKE #{...} AND workType = #{...} AND status = #{...} AND isDelete = #{...})

其等价于

WHERE (title LIKE #{...} OR (description LIKE #{...} AND workType = #{...} AND status = #{...} AND isDelete = #{...}))

这意味着如果 title 匹配,就会忽略后面的所有条件。


修复后:

提示:这里填写问题的分析:

例如:Handler 发送消息有两种方式,分别是 Handler.obtainMessage()Handler.sendMessage(),其中 obtainMessage 方式当数据量过大时,由于 MessageQuene 大小也有限,所以当 message 处理不及时时,会造成先传的数据被覆盖,进而导致数据丢失。

// 拼接查询条件 省略了从WorkQueryRequest的getXxx步骤
if (StringUtils.isNotBlank(searchText)) {
    queryWrapper.and(wrapper -> 
        wrapper.like("title", searchText).or().like("description", searchText)
    );
}
queryWrapper.eq(ObjectUtils.isNotEmpty(id), "id", id);
queryWrapper.like(StringUtils.isNotBlank(title), "title", title);
queryWrapper.eq(StringUtils.isNotBlank(workType), "workType", workType);
queryWrapper.eq(ObjectUtils.isNotEmpty(creatorId), "creatorId", creatorId);
queryWrapper.eq(ObjectUtils.isNotEmpty(status), "status", status);
queryWrapper.ge(ObjectUtils.isNotEmpty(minPrice), "total", minPrice);
queryWrapper.le(ObjectUtils.isNotEmpty(maxPrice), "total", maxPrice);

就变成了类似:

WHERE (title LIKE #{...} OR description LIKE #{...}) AND workType = #{...} AND status = #{...} AND isDelete = #{...}

控制台输出:

WHERE ((title LIKE #{ew.paramNameValuePairs.MPGENVAL1} OR description LIKE #{ew.paramNameValuePairs.MPGENVAL2}) AND workType = #{ew.paramNameValuePairs.MPGENVAL3} AND status = #{ew.paramNameValuePairs.MPGENVAL4} AND isDelete = #{ew.paramNameValuePairs.MPGENVAL5}) ORDER BY favorCount DESC

启示:

对于QueryWrapper的拼接还是需要谨慎,切忌乱用or()、and()、like()

具体的还得多看官方文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值