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("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-9