mybatis-plus的QueryWrapper为同一列设值时引发的bug

baomidou mybatisplus日常操作语法

下面 baomidou mybatisplus 简称 mybatisplus

比如查询的语法非常简单,如下:

QueryWrapper<User> qw = new QueryWrapper<>();
qw.eq("sex", 1);
int count = userMapper.selectCount(qw);

声明一个QueryWrapper对象,然后设置查询参数,eq()即等于,key是列名,value是值。接着调用mybatisplus封装的增删改查接口,就能执行我们想要的SQL操作。

如上面这段代码,自动拼装后的SQL语句如下:

SELECT COUNT( 1 ) FROM user WHERE deleted=0 AND (sex = ?) 

Tips: mybatisplus逻辑删除
细心的小朋友注意到SQL语句里多了“deleted=0”,这是修改baomidou mybatisplus的配置后,mybatisplus在拼接SQL语句时自动添加的逻辑删除。

YAML配置如下:

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted  # 全局逻辑删除的列名(since 3.3.0)
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

实体类配置如下:

/**
 * 是否删除: 0 未删除, 1已删除
 */
@TableLogic
private Integer deleted;

掉坑场景

查询user表sex=1的行数,接着查询user表sex=2的行数。

QueryWrapper<User> qw = new QueryWrapper<>();
qw.eq("sex", 1);
int count = userMapper.selectCount(qw);

qw.eq("sex", 2);
count = userMapper.selectCount(qw);

mybatisplus这种设参操作是不是很方便,类似日常Map集合的操作。如果你也这么认为,那就离掉坑里不远了。

以上代码拼装后执行的的SQL语句如下:

==>  Preparing: SELECT COUNT( 1 ) FROM user WHERE deleted=0 AND (sex = ?) 
==> Parameters: 1(Integer)



==>  Preparing: SELECT COUNT( 1 ) FROM user WHERE deleted=0 AND (sex = ? AND sex = ?) 
==> Parameters: 1(Integer), 2(Integer)

坑来了,第二条SQL语句是“WHERE deleted=0 AND (sex = 1 AND sex = 2) ”,怎么会是这样呢?


Map集合设值时,如果key相同默认会覆盖value呀!

Map<String, Object> param = new HashMap<>();
param.put("sex", 1);
log.info("{}", param);   //打印{sex=1}
param.put("sex", 2);
log.info("{}", param);   //打印{sex=2}

但QueryWrapper不是Map呀,只是操作语法像Map,哈哈!


解决办法

方法一:

QueryWrapper<Worker> qw = new QueryWrapper<>();
qw.eq("sex", 1);
int count = workerMapper.selectCount(qw);

qw.clear();
qw.eq("sex", 2);
count = workerMapper.selectCount(qw);

使用同一个QueryWrapper对象,使用完后通过qw.clear()清空参数,再重新设值使用。


方法二:

QueryWrapper<Worker> qw = new QueryWrapper<>();
qw.eq("sex", 1);
int count = workerMapper.selectCount(qw);

qw = new QueryWrapper<>();
qw.eq("sex", 2);
count = workerMapper.selectCount(qw);

声明两个QueryWrapper对象去封装参数。


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值