Mybatis-plus 中 like or and eq 的混合查询使用

Mybatis-plus 中 like()、 or()、 and()、 eq() 的混合查询使用【下面为项目中的代码片段】

一、测试的表结构与数据如下
在这里插入图片描述
二、需要与查询的原始sql如下:
需求:查询name中带 “a” 或者 class_level 中带 “22” 或者 ages 等于 22的名单!

SELECT * FROM student WHERE name LIKE '%a%' AND ( class_level LIKE '%22%' OR ages = 22);

查询结果
在这里插入图片描述
三、mybatis-plus的查询代码:

String name = "a";
String level = "22";
String ageStr = "22";
LambdaQueryWrapper<Student> query = new LambdaQueryWrapper<>();
query.like(StringUtils.isNotEmpty(name), Student::getName, name)
        .and(wrapper -> wrapper.like(StringUtils.isNotEmpty(level), Student::getClassLevel, level ).or().eq(ageStr.matches("^[1-9]\\d*$"), Student::getAges, Integer.parseInt(ageStr)));
List<Student> studentList = studentService.list(query);

四、在实际工作中可能出现的问题,如果参数 ageStr并不是真正的数字时上面的写法是有问题的
因为 eq()函数会先执行 Integer.parseInt(ageStr) 然后再执行判断条件 ageStr.matches("1\d*$")是否是正数;所以需要调整如下:

String name = "a";
String level = "22";
String ageStr = "s22";
LambdaQueryWrapper<Student> query = new LambdaQueryWrapper<>();
query.like(StringUtils.isNotEmpty(name), Student::getName, name);
if (ageStr.matches("^[1-9]\\d*$")) {  //判断 ageStr是否是正数
    query.and(wrapper -> wrapper.like(StringUtils.isNotEmpty(level), Student::getClassLevel, level ).or().eq(Student::getAges, Integer.parseInt(ageStr)));
} else {
    query.and(wrapper -> wrapper.like(StringUtils.isNotEmpty(level), Student::getClassLevel, level ));
}
List<Student> studentList = studentService.list(query);

  1. 1-9 ↩︎

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值