JSqlParser 5.2 的解析缺陷

Blade 未结 1 8

一、该问题的重现步骤是什么?

1. `mybatis-plus-jsqlparser 3.5.16` +`jsqlparser 5.2` +`blade-starter-tenant 4.10.1`在 system模块开启多租户后和sql执行冲突

2. 

3.


二、你期待的结果是什么?实际看到的又是什么?

        正常执行sql,但是实际执行的时候where条件被截取掉了

三、你正在使用的是什么产品,什么版本?在什么操作系统上?

bladex 4.10.1.RELEASE,  centos7+和Win11

四、请提供详细的错误堆栈信息,这很重要。

image.png

f2a296c9c6261a1be50000a2fe6ef330.png

五、若有更多详细信息,请在下面提供。

2026-10-10 10:21:56.261 ERROR 37104 --- [192.168.0.186-0] c.a.n.c.remote.client.grpc.GrpcClient    : [1791598882283_192.168.20.62_52102]Request stream onCompleted, switch server


Creating a new SqlSession


SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1c7cf09a] was not registered for synchronization because synchronization is not active


2026-10-10 10:21:56.797  WARN 37104 --- [  XNIO-1 task-3] com.sinoma.system.SystemApplication      : [SQL-TRACE][BEFORE] id=com.sinoma.system.mapper.DictMapper.getDict tenantId= paramCount=2 sql=SELECT db.id, db.parent_id, db.`code`, db.is_sealed, db.dict_key, db.dict_value, db.remark, db.sort FROM sys_dict db WHERE db.is_deleted = 0 AND db.parent_id !=0 and db.code = ? and db.dict_key = ? limit 1


2026-10-10 10:21:56.797  WARN 37104 --- [  XNIO-1 task-3] com.sinoma.system.SystemApplication      : [SQL-TRACE][BEFORE-RAW] id=com.sinoma.system.mapper.DictMapper.getDict len=440 idxFrom=172 idxWhere=209 idxLimit=433 esc=SELECT\n        db.id,\n        db.parent_id,\n        db.`code`,\n        db.is_sealed,\n        db.dict_key,\n        db.dict_value,\n        db.remark,\n        db.sort\n        FROM\n        sys_dict db\n\n\n\n\n        WHERE db.is_deleted = 0\n        AND db.parent_id !=0\n         \n             \n                and db.code = ?\n             \n             \n             \n                and db.dict_key = ?\n             \n             \n\n        limit 1


2026-10-10 10:21:56.852  WARN 37104 --- [  XNIO-1 task-3] com.sinoma.system.SystemApplication      : [SQL-TRACE][PARSE-RAW] id=com.sinoma.system.mapper.DictMapper.getDict sql=SELECT db.id, db.parent_id, db.`code`, db.is_sealed, db.dict_key, db.dict_value, db.remark, db.sort FROM sys_dict db


2026-10-10 10:21:56.882  WARN 37104 --- [  XNIO-1 task-3] com.sinoma.system.SystemApplication      : [SQL-TRACE][PARSE-MP ] id=com.sinoma.system.mapper.DictMapper.getDict sql=SELECT db.id, db.parent_id, db.`code`, db.is_sealed, db.dict_key, db.dict_value, db.remark, db.sort FROM sys_dict db


2026-10-10 10:22:38.375 ERROR 37104 --- [92.168.0.186-13] c.a.n.c.remote.client.grpc.GrpcClient    : [1791598812174_192.168.20.62_55073]Request stream onCompleted, switch server


2026-10-10 10:22:40.030 ERROR 37104 --- [listener.task-0] com.alibaba.nacos.common.remote.client   : Send request fail, request = ConfigBatchListenRequest{headers={charset=UTF-8, Client-AppName=unknown, Client-RequestToken=4776c64ddad821c9abdd8eb31fad44b6, Client-RequestTS=1791598958368, exConfigInfo=true}, requestId='null'}, retryTimes = 0, errorMessage = Client not connected, current status:UNHEALTHY


2026-10-10 10:22:38.901 ERROR 37104 --- [remote.worker.1] c.a.n.c.remote.client.grpc.GrpcClient    : Server check fail, please check server 192.168.0.186, port 9848 is available, error ={}


java.util.concurrent.TimeoutException: Waited 3000 milliseconds (plus 38529 milliseconds, 228300 nanoseconds delay) for com.alibaba.nacos.shaded.io.grpc.stub.ClientCalls$GrpcFuture@3fff4bd4[status=PENDING, info=[GrpcFuture{clientCall=PendingCall{realCall=ClientCallImpl{method=MethodDescriptor{fullMethodName=Request/request, type=UNARY, idempotent=false, safe=false, sampledToLocalTracing=true, requestMarshaller=com.alibaba.nacos.shaded.io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller@7bc61f4a, responseMarshaller=com.alibaba.nacos.shaded.io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller@5defc8dc, schemaDescriptor=com.alibaba.nacos.api.grpc.auto.RequestGrpc$RequestMethodDescriptorSupplier@249c40c0}}}}]]


at com.alibaba.nacos.shaded.com.google.common.util.concurrent.AbstractFutureState.blockingGet(AbstractFutureState.java:221)


at com.alibaba.nacos.shaded.com.google.common.util.concurrent.Platform.get(Platform.java:59)


at com.alibaba.nacos.shaded.com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:238)


at com.alibaba.nacos.common.remote.client.grpc.GrpcClient.serverCheck(GrpcClient.java:234)


at com.alibaba.nacos.common.remote.client.grpc.GrpcClient.connectToServer(GrpcClient.java:346)


at com.alibaba.nacos.common.remote.client.RpcClient.reconnect(RpcClient.java:504)


at com.alibaba.nacos.common.remote.client.RpcClient.lambda$start$1(RpcClient.java:330)


at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)


at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317)


at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)


at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)


at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)


at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)


at java.base/java.lang.Thread.run(Thread.java:1583)


2026-10-10 10:22:40.082  WARN 37104 --- [  XNIO-1 task-2] .c.RetryAwareServiceInstanceListSupplier : No instances found after removing previously used service instance from the search (com.alibaba.cloud.nacos.NacosServiceInstance@caf382a4). Returning all found instances.


2026-10-10 10:22:40.125  WARN 37104 --- [  XNIO-1 task-4] i.m.core.instrument.MeterRegistry        : This Gauge has been already registered (MeterId{name='sentinel_current_threads', tags=[tag(resource=/client/dict/get-value)]}), the registration will be ignored. Note that subsequent logs will be logged at debug level.


2026-10-10 10:22:40.128  INFO 37104 --- [  XNIO-1 task-4] o.s.core.log.aspect.RequestLogAspect     :


================  Request Start  ================


===> GET: /client/dict/get-value Parameters: {"code":"org_category","dictKey":"1"}


===Headers===  x-real-ip: 192.168.20.62


===Headers===  authorization: Basic c2lub21hOnNpbm9tYV9zZWNyZXQ=


===Headers===  Accept: */*


===Headers===  Blade-AccountId: 1123598821738675201


===Headers===  User-Agent: Java/21.0.9


===Headers===  Connection: keep-alive


===Headers===  Blade-TenantId: 000000


===Headers===  Host: 192.168.20.62:8106


===Headers===  Blade-Inner: 1


================   Request End   ================


解决方案:

在启动类加上了下面的过滤

Pattern = Pattern.();

MybatisPlusInterceptorCustomizer () {
    InnerInterceptor normalizer = InnerInterceptor() {
        (Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds,
                                ResultHandler resultHandler, BoundSql boundSql) {
            String sql = boundSql.getSql();
            (sql == || sql.indexOf() < ) {
                ;
            }
            String normalized = .matcher(sql).replaceAll();
            (!normalized.equals(sql)) {
                PluginUtils.(boundSql).sql(normalized);
                .debug(, ms.getId());
            }
        }
    };
    interceptor -> {
        List<InnerInterceptor> list = ArrayList<>(interceptor.getInterceptors());
        list.add(, );
        interceptor.setInterceptors(list);
    };
}


1条回答
  • 后面版本空了看下

    0 讨论(0)
提交回复