最近在使用MyBatisPlus的时候遇到一个问题,就是controller中被spring封装bean,在默认使用MP的QueryWrapper构造查询的时候主键是空字符,也就是""
的时候,仍然会被作为查询条件,被拼接到sql中了。
例如
productService.list(new GenericQueryWrapper<Product>(product))
注意,这里只是主键,其他的字段可以通过全局的
mybatis-plus.global-config.db-config.select-strategy=not_empty
来处理,特殊情况可以用TableField注解实现。
Google了一大圈,发现并没有好的解决办法,倒是看到一个哥们的文章,链接找不到了,但是方法并不是很好,在每次查询面前,对主键做一个判断,但是这样就很不方便了。
public TableDataInfo list(Product product)
{
if (StringUtils.isEmpty(product.getProductId())) {
product.setProductId(null);
}
startPage();
return getDataTable(productService.list(new GenericQueryWrapper<Product>(product)));
}
后来就干脆做一个通用的办法,本身我也是在MybatisPlus的QueryWrapper上做了一层通用查询的,常用的也是这个类,所以,在构造方法上,做了一些改动,通过反射和注解判断,来解决这个问题,但是这也只是临时方案,并不完美,代码如下:
public GenericQueryWrapper(T entity) {
this.sqlSelect = new SharedString();
super.setEntity(entity);
super.initNeed();
nonEmptyPrimary4Select();
}
/**
* @Description: [处理查询的时候主键为空字符串的问题]
* @Author: 老王
* @Date: 2021/8/19 4:59 下午
*/
private void nonEmptyPrimary4Select(){
try {
//判断是否有entity构造
if(entity == null || !(entity instanceof BaseEntity)){
return;
}
//获取所有字段
Field[] fs = entity.getClass().getDeclaredFields();
for(Field f:fs){
//判断字段是否有TableId的注解
if(f.isAnnotationPresent(TableId.class)){
//设置权限,要读取内容
f.setAccessible(true);
//如果有空字符串,则修改为null
if(StringUtils.isEmpty(f.get(entity))){
f.set(entity,null);
}
break;
}
}
} catch (IllegalAccessException e) {
//e.printStackTrace(); 如果有异常就忽略
}
}