统计的原生SQL应该是这样的:

SELECTCOUNT( 1 )
FROMtable_name
WHERE( id = '679135XXXXXXX1212' AND ( STATUS = 1 OR STATUS = 2 ) AND isRemoved = 0)

服务端使用mybatis框架的QueryWrapper【query包装器】来统计子设备,之前的查询语法是这样的:

public int method(String id, int isRemoved) {QueryWrapper queryWrapper = new QueryWrapper<>();queryWrapper.eq("id", id);queryWrapper.eq("status", DeviceConstant.DeviceStatus.WORK).or().eq("status", DeviceConstant.DeviceStatus.FAULT);return mapper.selectCount(queryWrapper);}

但是生成出来的SQL语句是

SELECTcount(1)
FROMtable_name
WHERE( id = '679135XXXXXXX1212' AND STATUS = 1  OR STATUS = 2 AND isRemoved = 0);

正如我们所知道的那样,MySQL中的 and的优先级高于or,因而,上面的SQL语句可以转化为

SELECTcount(1)
FROMtable_name
WHERE( (id = 679135XXXXXXX1212 AND STATUS = 1 )  OR (STATUS = 1 AND isRemoved = 0) );

于是,就违背了我们最初的SQL语句,自然查询出来的有可能不对,导致统计的结果不对,因为这样的SQL语句表明:查询出设备Id等于‘679135XXXXXXX1212’且状态等于1,或者所有未移除的设备的状态等于2。

因此,mybatis的queryMapper的查询语法需要修改,如下:

public int method(String id, int isRemoved) {QueryWrapper queryWrapper = new QueryWrapper<>();queryWrapper.eq("id", id);queryWrapper.and(wrapper -> wrapper.eq("status", DeviceConstant.DeviceStatus.WORK).or().eq("status", DeviceConstant.DeviceStatus.FAULT));return mapper.selectCount(queryWrapper);}

这种方式生成的SQL语句如下

SELECTCOUNT( 1 )
FROMtable_name
WHERE( id = ? AND ( ( STATUS = ? OR STATUS = ? ) ) AND isRemoved = ? )

这样的SQL才是我们想要的查询语句。

这是一个很细节的语法,一旦不注意,就陷入了mybatis的陷阱中。mybatis本身没有问题,本身是个优秀的框架。

mybatis框架中的queryWrapper的or查询,联想到MySQL中and 和or的关系相关推荐

  1. 【MySQL】面试官:如何查询和删除MySQL中重复的记录?

    写在前面 最近,有小伙伴出去面试,面试官问了这样的一个问题:如何查询和删除MySQL中重复的记录?相信对于这样一个问题,有不少小伙伴会一脸茫然.那么,我们如何来完美的回答这个问题呢?今天,我们就一起来 ...

  2. mysql中用户权限的授予_如何在MySQL中创建用户和授予权限

    如何创建MySQL用户并授予权限?为了实现良好的安全性,需要为每个应用程序创建单独的用户帐户,而不是root用户访问数据库.这将确保应用程序无法访问其他应用程序的数据库.因此需要mysql管理员(ro ...

  3. 【MyBatis框架】高级映射-一对多查询

    前面学习了一对一的查询,现在我们在刚才的数据模型基础上进行一对多的查询. 一对多查询 1.需求 查询订单及订单明细的信息. 2.sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查 ...

  4. mysql单台跨数据库查询_在MySQL中怎样进行跨库查询?

    在MySQL中跨库查询主要分为两种情况,一种是同服务的跨库查询:另一种是不同服务的跨库查询:它们进行跨库查询是不同的,下面就具体介绍这两种跨库查询. 一.同服务的跨库查询 同服务的跨库查询只需要在关联 ...

  5. mysql用编号查询密码,【mysql中退出当前数据库】

    创建表部( id int(10), 名称varchar(20), 洛克瓦尔查(50) ); 添加主键并将主键设置为增长 ALTER TABLE`emp` MODIFY COLUMN`id` int(1 ...

  6. mysql怎么子查询_在mysql中如何进行子查询?

    在mysql中,子查询是指将一个查询语句嵌套在另一个查询语句中,可以在SELECT.UPDATE和 DELETE语句中配合WHERE子句进行实现,WHERE子句中语法格式为"WHERE (另 ...

  7. python向mysql中添加数据标签_用python在MySQL中写入数据和添加数据

    在笔者之前的博文中,已介绍了用python连接与mysql数据库的知识.包括如何安装python连接mysql的pymysql包,如何通过cusor语句将python与mysql连接起来,以及如何用p ...

  8. mysql中以下正确的sql是_总结MySQL中SQL语法的使用

    --where子句操作符: where子句操作符 = 等于 <> 不等于(标准语法) != 不等于(非标准语法,可移植性差) < 小于 <= 小于等于 > 大于 > ...

  9. mysql中3个月之前日期_在MySQL中从当前日期选择当前日期到3个月之间的日期?

    使用BETWEEN和INTERVAL实现此目的.让我们首先创建一个表-mysql> create table DemoTable -> ( -> AdmissionDate date ...

最新文章

  1. 如何配置Windows Live Writer
  2. Swagger+AutoRest 生成web api客户端(.Net)
  3. redis过期机制(官网文档总结)
  4. vb.net2019-跨平台
  5. 为啥八位的计算机可以用补码表示-128
  6. sqlalchemy 外键
  7. 【javascript高级教程】JavaScript Array(数组) 对象
  8. MySQL 修改数据
  9. php sql判断l列的存在,thinkphp 模块不存在:404
  10. 1.14 关于梯度检验实现的注记
  11. Python:[-1]、[:-1]、[::-1]、[n::-1] 原理大详解(超全超仔细!)
  12. python浮点数保留两位小数_(RPA)学习——Python 保存两位小数
  13. C++ popcount()含义
  14. git可视化工具—GitKraken
  15. mysql集群和memcached_Memcached 高可用集群架构
  16. 获取局域网电脑序列号
  17. 【20保研】华东师范大学计算机科学与软件工程学院第五届“高可信软件工程优秀大学生夏令营”活动通知...
  18. 《2019-2020中国开发者调查报告》发布了!
  19. GitHub置顶半个月!78w字百亿级并发设计(全彩PDF),竟出自京东
  20. 计算机丢失dll文件怎么弄,电脑缺少DLL文件该怎么办? 这个办法轻松解决!

热门文章

  1. 商汤2021春季校园招聘正式启动!“春招百晓生”系列空宣强势来袭
  2. 论文盘点:性别年龄分类器详解
  3. 小马智行Pony.ai 2020校招宣讲行程来了!
  4. 重磅 | 带学斯坦福CS231n计算机视觉课+带打全球顶级kaggle大赛
  5. AAAI 2018论文解读 | 基于文档级问答任务的新注意力模型
  6. 西安科技大学计算机考研难度,西安科技大学考研难吗
  7. python3.6环境变量设置win10_python——python3.6环境搭建(Windows10,64位)
  8. java oci_java oracle oci方式连接
  9. 【❤️算法系列之二叉树的实现(包含前序、中序、后序遍历以及节点的查找和删除)❤️】
  10. 《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第七章——自编解析与答案