baomidou / mybatis-plus

An powerful enhanced toolkit of MyBatis for simplify development
https://baomidou.com
Apache License 2.0
16.12k stars 4.26k forks source link

in 条件collection为空集合会导致异常,建议优化 #6286

Closed LIANGQI0811 closed 3 weeks ago

LIANGQI0811 commented 3 weeks ago

当前使用版本 当前master分支代码 当前环境信息 例如: Java8 + Mysql5.7 java8+mysql 8 描述bug现象 我注意到com.baomidou.mybatisplus.core.conditions.AbstractWrapper的方法定义如下:

     /**
     * 获取in表达式 包含括号
     *
     * @param value 集合
     */
    protected ISqlSegment inExpression(Collection<?> value) {
        if (CollectionUtils.isEmpty(value)) {
            return () -> "()";
        }
        return () -> value.stream().map(i -> formatParam(null, i))
            .collect(joining(StringPool.COMMA, StringPool.LEFT_BRACKET, StringPool.RIGHT_BRACKET));
    }

当queryWrapper的in()条件传入的参数是空集合或者null的时候,生成的SQL如下:

select * from t_student where age in ();

执行这个SQL,MySQL server会返回一个错误。 按照开发原则讲,实际上这是一个错误的SQL不应该传递给MySQL server,原则上应当尽早抛出异常。 所以,我建议这个方法定义更改为:

    /**
     * 获取in表达式 包含括号
     *
     * @param value 集合
     */
    protected ISqlSegment inExpression(Collection<?> value) {
        if (CollectionUtils.isEmpty(value)) {
            throw new RuntimeException("xxx condition in can't be empty conllection!"); //xxx应当替换为条件字段名
        }
        return () -> value.stream().map(i -> formatParam(null, i))
            .collect(joining(StringPool.COMMA, StringPool.LEFT_BRACKET, StringPool.RIGHT_BRACKET));
    }

提供问题复现步骤

提供完整堆栈日志(可选)

提供问题复现工程(可选) 请尽量提供复现工程,减少大家排错的时间.

miemieYaho commented 3 weeks ago

就这样,你们需要自己判断抛出你们自己的异常

LIANGQI0811 commented 3 weeks ago

就算强制要求用户抛异常处理,你保持现状是掩盖了问题,而且问题会向下传导