MybatisPlus主键为空字符串仍然被查询

最近在使用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(); 如果有异常就忽略
        }
    }

站内相关文章:

Comment ()
如果您有不同的看法,或者疑问,欢迎指教