背景
查询参数如下:
问题描述
查询条件只匹配了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()
。
具体的还得多看官方文档。