需求如下:
如果:如果设置值的时候,值为空则不执行查询语句
代码:
当isDeleted为null的时候
@Test
void method() {
Integer isDeleted = null;
LambdaQueryWrapper<Entity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(!ObjectUtils.isEmpty(isDeleted),DeviceBrand::getIsDeleted,isDeleted);
log.info(String.valueOf(queryWrapper));
}
调试结果:
此时expression里面的normal size == 0
当isDeleted为1的时候
@Test
void method() {
Integer isDeleted = 1;
LambdaQueryWrapper<Entity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(!ObjectUtils.isEmpty(isDeleted),DeviceBrand::getIsDeleted,isDeleted);
log.info(String.valueOf(queryWrapper));
}
此时expression里面的normal size == 3
于是乎我翻了一下mybatis-plus源码
protected Children addCondition(boolean condition, R column, SqlKeyword sqlKeyword, Object val) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), sqlKeyword,
() -> formatParam(null, val)));
}
protected final Children maybeDo(boolean condition, DoSomething something) {
if (condition) {
something.doIt();
}
return typedThis;
}
如果condition为 true则执行右边的函数,为false则反之