MyBatis自定义插件修改sql导致MyBatis分页插件分页sql有误(增加不必要条件)

        MyBatis自定义插件,增加查询sql的查询条件,普通账户的sql增加条件,导致超管的sql也增加了查询条件(超管不增加)。代码如下:

        自定义插件:

@Intercepts({@Signature(
    method = "query",
    type = Executor.class,
    args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}
)})
public class InstancePermissionPlugin implements Interceptor {
    public Object intercept(Invocation invocation) throws Throwable {
        Object[] args = invocation.getArgs();
        logger.debug("args {}, {}", args.length, args);
        MappedStatement ms = (MappedStatement)args[0];
        Object params = args[1];
        BaseRequestModel baseEntity = null;
        if (params instanceof Map) {
            Iterator var6 = ((Map)params).values().iterator();

            while(var6.hasNext()) {
                Object obj = var6.next();
                if (obj instanceof BaseRequestModel) {
                    baseEntity = (BaseRequestModel)obj;
                    break;
                }
            }
        } else if (params instanceof BaseRequestModel) {
            baseEntity = (BaseRequestModel)params;
        }

        if (baseEntity == null) {
            return invocation.proceed();
        } else if ((!StringUtils.isEmpty(baseEntity.getPermissionUser()) || !Collections3.isEmpty(baseEntity.getDeptList())) && baseEntity.getIsIntercept()) {
            PermissionDataKey annotation = (PermissionDataKey)baseEntity.getClass().getAnnotation(PermissionDataKey.class);
            if (annotation == null) {
                return invocation.proceed();
            } else {
	            //普通用户此处修改sql
                ......
                //普通用户吸怪了args[0],即MappedStatement 
                args[0] = this.updateMs(ms, params, plainSelect.toString());
            }
        } else {
            //超管没有修改,直接过了
            return invocation.proceed();
        }
    }
}

   分页插件配置:



		
		
		
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
		
        
	

        分页插件改变MappedStatement的SqlSource属性为PageSqlSource类型,PageSqlSource即分页sql,并缓存到Map msCountMap中,

MyBatis自定义插件修改sql导致MyBatis分页插件分页sql有误(增加不必要条件)_第1张图片

 MyBatis自定义插件修改sql导致MyBatis分页插件分页sql有误(增加不必要条件)_第2张图片

         MappedStatement已经被分页插件修改为SqlPageSource了。普通用户修改了sql,由于普通用户每次的MappedStatement都是新建的,因此SqlSource不是PageSourceSql类型,所以每次都会放一个新的到msCountMap中,由于ms.getId和超管的一样,所以会把超管的MappedStatement覆盖,超管的不是新建的MappedStatement,所以SqlSource字段的类型是PageSqlSource,所以是直接从msCountMap获取MappedStatemen,导致sql是普通用户的SQL,导致查询出来的数据是错误的。

        解决办法是在自定义插件中,超管的也新建一个MappedStatement,这样SqlSource就不是PageSqlSource,每次的都是新的,就不会用到普通用户的SQL。

 

你可能感兴趣的:(JAVA,mybatis,mybatis,java)