当前位置:   article > 正文

【Java】MyBatis框架中的queryWrapper的or查询,联想到MySQL中and 和or的关系_java querywrapper or

java querywrapper or

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

SELECT
	COUNT( 1 ) 
FROM
	table_name 
WHERE
	( 
		id = '679135XXXXXXX1212' 
		AND ( STATUS = 1 OR STATUS = 2 ) 
		AND isRemoved = 0
	)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

服务端使用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);
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

但是生成出来的SQL语句是

SELECT
	count(1) 
FROM
	table_name 
WHERE
	( 
		id = '679135XXXXXXX1212' AND STATUS = 1  
		OR STATUS = 2 AND isRemoved = 0
	);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

SELECT
	count(1) 
FROM
	table_name 
WHERE
	( 
		(id = 679135XXXXXXX1212 AND STATUS = 1 )  
		OR (STATUS = 1 AND isRemoved = 0) 
	);

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

于是,就违背了我们最初的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);
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

SELECT
	COUNT( 1 ) 
FROM
	table_name 
WHERE
	( 
		id = ? 
	 	AND ( ( STATUS = ? OR STATUS = ? ) ) 
		AND isRemoved = ? 
	)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/43659
推荐阅读
相关标签
  

闽ICP备14008679号