确认

  • [X] 我的版本是最新版本, 我的版本号与 version 相同, 并且项目里无依赖冲突
  • [X] 我已经在 issue 中搜索过, 确认问题没有被提出过
  • [X] 我已经修改标题, 将标题中的 描述 替换为遇到的问题

当前程序版本

3.5.6

问题描述

问题描述:返回null时会重复拼接Where语句 代码: ` public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

    //数据权限插件
    DataPermissionInterceptor dataPermissionInterceptor = new DataPermissionInterceptor();
    dataPermissionInterceptor.setDataPermissionHandler(new MyDataPermissionInterceptor());
    interceptor.addInnerInterceptor(dataPermissionInterceptor);

    //分页
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    //乐观锁
    interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
    return interceptor;
}`

` @Override public Expression getSqlSegment(Table table, Expression where, String mappedStatementId) {

    String methodName = StringUtils.substringAfterLast(mappedStatementId, Strings.DOT);
    try {
        Class<?> clazz = Class.forName(mappedStatementId.substring(0, mappedStatementId.lastIndexOf(".")));
        Method[] methods = clazz.getDeclaredMethods();
        if (!shouldFilter(methodName, methods)) {
            return where;
        }
        Method method = clazz.getDeclaredMethod(methodName);
        //注解
        DataPermission dataPermission = method.getAnnotation(DataPermission.class);
        log.info("数据权限过滤 Method -> {}", mappedStatementId);
        return dataPermissionSql(table, where, dataPermission);
    } catch (Exception e) {
        log.error("数据权限过滤异常,{}", e.getMessage());
    }
    return null;
}`

详细堆栈日志

日志:
2024-07-21 11:33:25 @artifactId@ INFO  QuartzScheduler_FEBS_NEXT_SCHEDULE-lizhanlngdeiMac1721532778135_MisfireHandler p6spy 
deleted = 1 AND (username = ?)
2024-07-21 11:33:28 @artifactId@ INFO  http-nio-8081-exec-3 p6spy 2024-07-21 11:33:28 | 耗时 3 ms | SQL 语句:
SELECT id, user_id, dept_id, dept_ids, username, password, nickname, user_real_name, email, phone, user_sex, user_avatar AS avatar, remark, dept_level, web_setting, status, last_login_time, deleted, create_id, create_time, update_id, update_time, version FROM t_user WHERE deleted = 1 AND (username = 'system') AND deleted = 1 AND (username = NULL);

其中它会重复拼接
WHERE deleted = 1 AND (username = 'system') AND deleted = 1 AND (username = NULL);

Comment From: RuningFastChack

已经解决,不用拦截的一定要返回null,而不是where