使用mybati-plus的条件构造器QueryWrapper的eq(boolean condition, R column, Object val) 容易踩的坑!

话不多说:代码容易踩的坑我来踩,免费的赞赞你来点。

先说一下这个eq函数三个参数的作用。

第一个参数boolean condition代表条件判断,也就是我们可以写条件判断,如果条件最终结果是true,那么sql就会有where条件;如果是false,那么sql就不会有where条件【注意:这里是该字段不会再sql语句中带上where,但无论条件成立与否,都会走后面的两个参数】

第二个参数R column 代表数据表中的列名。

第三个参数object val代表列名对应的值。

现在看一个具体例子:比如现在我有一个接口,查询数据库中一张数据表里面的所有数据,假如叫做sys_operation_log系统操作日志,并且搜索条件是时间范围,有开始时间和结束时间,然后现在前端说有一个vue组件是date-picker,该组件默认传数组,问我是否方便接收数组,我说可以。所以现在的接口就是这样子的。

@Autowired

SysOperationLogService sysOperationLogService ;

@GetMapping("/queryAll")

@ResponseBody

public SysOperationLogDTO queryAll(@RequestParam(value = "时间范围") , required = false) List<String> datePicker){

        QueryWrapper<SysOperationLogDTO> queryWrapper = new QueryWrapper<SysOperationLogDTO >() ;

        queryWrapper.between(!CollectionUtils.isEmpty(datePicker) , datePicker.get(0),datePicker.get(1)) ;

//本来这个判断如果不成立,是不会走下面的,但是现在后面的datePicker.get(0),datePicker.get(1)还是会走到,这样就会导致空指针异常!所以我们最后用if去判断

if(!CollectionUtils.isEmpty(datePicker)){}。

所以以后谨慎使用这个判断,当然如果她是基本数据类型,而不是引用数据类型的话【数组,对象】我们还是可以用的。

        sysOperationLogService.list(queryWrapper) ;

}

总结:QueryWrapper的xx(boolean condition , R column , object val);第一个参数无论成不成立true or false最终还是会走后面的column 和 val,所以当遇到引用数据类型比如数组.get()、对象.getXXX(),如果此时为空的话,会报空指针异常!所以以后遇到引用数据类型不要使用condition,直接用if判断或者Optional.ofNullable(T val).ifPresent();如果是基本数据类型可以。

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值