当前使用版本

当前版本: 3.3.1

该问题是怎么引起的?

问题是这样的, 前端传过来的查询条件中 有的属性是null 有的属性是空字符串 即: "" 这个时候我用 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.setEntity(user); //因为这样设置最省事. 比如说User类有两个属性分别是A和B, 值分别为null和"" 那么此时生成的查询条件就会是 B = '' 理论上应该一个查询条件也没有才对 我翻阅了一下前人提的帖子 如 #452 给出的方式是如下: QueryWrapper.eq(boolean,column,value) 这种方式是对单个字段来设置的, 如果我这个类有20个或更多个属性我就需要写更多的代码来处理这个空字符串的问题. 是不是特别的费事.

如果说queryWrapper.setEntity(user);方法也加一个如QueryWrapper.eq(boolean,column,value)这个方法的第一个参数就好了.

不知道我表达的清楚否? 请大神帮忙看看这个问题吧..

重现步骤

报错信息

Comment From: ThailandKing

可通过配置确定生成SQL的条件,如下配置可以解决字段为空或NULL时不生成查询条件 mybatis-plus.global-config.db-config.select-strategy=not_empty

Comment From: ThailandKing

参考官方配置:https://mp.baomidou.com/config/#insertstrategy 个人开发建议:

全局设置 mybatis-plus.global-config.db-config.select-strategy=not_empty

1、查询时 根据wrapper.setEntity(user); //因为这样设置最省事,有了上面的全局配置,自动过滤字段为空为NULL的查询条件

QueryWrapper<User> wrapper = new QueryWrapper<>();
User user = new User();
user.setEmail(null);
user.setName("");
user.setVersion(1);
wrapper.setEntity(user);
List<User> userList = userMapper.selectList(wrapper);
userList.forEach(item -> System.out.println(item));

2、更新时 根据业务逻辑指定字段更新,或者XML配置动态SQL

Comment From: ThailandKing

wrapper.setEntity(user); 只能设置等值查询条件,对于like模糊查询等不适用

Comment From: ThailandKing

在 select 的时候的字段验证策略: wrapper 根据内部 entity 生成的 where 条件 目前没有默认值,等 {@link #fieldStrategy} 完全去除掉,会给个默认值 NOT_NULL 没配则按 {@link #fieldStrategy} 为准

Comment From: miemieYaho

如上

Comment From: zzdehao

完美解决了, 我的问题. 上面说的like问题, 我会在代码里单独设置, 并且设置完后把对应的属性设置为null, 这样20个字段3个like工作量也就没有那么大了. 完美!!!