expect RPAREN, actual LPAREN pos 31, line 1, column 14, token LPAREN

当遇到`expect RPAREN, actual LPAREN pos`这类Druid解析SQL错误时,可能是由于Druid数据库连接池过滤器对某些关键字处理不当。尽管SQL在MySQL8.0中能正常执行,但在程序中可能因解析问题导致异常。解决方案是检查SQL中的保留关键字,用反引号(`)将其包裹。尝试修改SQL查询语句,而不是仅修改关键字格式,以解决该异常。" 115971791,10542940,MATLAB实现:多尺度低秩稀疏分解及ADMM算法,"['低秩稀疏分解', 'MATLAB', '算法实现']

对于复杂sql执行时报错信息:

com.alibaba.druid.sql.parser.ParserException: syntax error, error in :' tmp as ((', expect RPAREN, actual LPAREN pos 31, line 1, column 14, token LPAREN

首先报错sql放到mysql8.0执行是ok的。但是在程序里报错。说明是解析sql时有问题导致生成的sql执行出现问题。问题就出现druid数据库连接池过滤器发现一些关键字,或者保留关键字没做引号标注,会报异常。


具体的sql及其报错信息如下。

 

merge sql error, dbType mysql, druid-1.1.21, sql : with tmp as (
                (
                        select cvi.id                    as virtualClassId,
                               cvi.start_time            as startTime,
                               cvi.student_user_id       as id,
                               usi.real_name             as name,
                               1                         as classType,
                               ce.id                     as editionId,
                               ci.course_name            as courseName,
                               cl.unit_no                as unitNo,
                               cl.unit_lesson_no         as unitLessonNo,
                               cvi.feedback_status       as feedbackStatus,
                               cvi.teacher_attend_status as teacherAttendStatus
                        from classroom_virtualclass_info cvi
                                     inner join finance_classroom_audit fca on fca.virtual_class_id = cvi.id
                                     inner join user_student_info usi on cvi.student_user_id = usi.id
                                     inner join course_lesson cl on cvi.lesson_id = cl.id
                                     inner join course_info ci on cl.course_id = ci.id
                                     inner join course_edition ce on ci.course_edition_id = ce.id
                        where cvi.tutor_user_id = ?
                          and cvi.start_time >= ?
                          and cvi.start_time <= ?
                          and cvi.remove = 0
                          and cvi.status in (3, 4)
                          and fca.remove = 0
                          and fca.class_type_id = 1
                        )
                union all
                (
                        select svi.id                    as virtualClassId,
                               svi.start_time            as startTime,
                               svi.class_id              as id,
                               sci.class_name_zh         as name,
                               2                         as classType,
                               ce.id                     as editionId,
                               ci.course_name            as courseName,
                               cl.unit_no                as unitNo,
                               cl.unit_lesson_no         as unitLessonNo,
                               svi.feedback_status       as feedbackStatus,
                               svi.teacher_attend_status as teacherAttendStatus
                        from smallclass_virtualclass_info svi
                                     inner join finance_classroom_audit fca on fca.virtual_class_id = svi.id
                                     inner join smallclass_class_info sci on svi.class_id = sci.id
                                     inner join course_lesson cl on svi.lesson_id = cl.id
                                     inner join course_info ci on cl.course_id = ci.id
                                     inner join course_edition ce on ci.course_edition_id = ce.id
                        where svi.tutor_user_id = ?
                          and svi.start_time >= ?
                          and svi.start_time <= ?
                          and svi.remove = 0
                          and svi.status in (3, 4)
                          and fca.remove = 0
                          and fca.class_type_id = 1
                        )
                )
        select tmp.*
        from tmp as tmp
        order by tmp.startTime desc LIMIT ? 
com.alibaba.druid.sql.parser.ParserException: syntax error, error in :' tmp as (
                (
       ', expect RPAREN, actual LPAREN pos 31, line 1, column 14, token LPAREN
        at com.alibaba.druid.sql.parser.SQLParser.printError(SQLParser.java:344)
        at com.alibaba.druid.sql.parser.SQLParser.accept(SQLParser.java:352)
        at com.alibaba.druid.sql.parser.SQLStatementParser.parseWithQuery(SQLStatementParser.java:3311)
        at com.alibaba.druid.sql.parser.SQLStatementParser.parseWith(SQLStatementParser.java:3327)
        at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:242)
        at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:171)
        at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.parameterize(ParameterizedOutputVisitorUtils.java:98)
        at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.parameterize(ParameterizedOutputVisitorUtils.java:81)
        at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.parameterize(ParameterizedOutputVisitorUtils.java:54)
        at com.alibaba.druid.filter.stat.StatFilter.mergeSql(StatFilter.java:147)
        at com.alibaba.druid.filter.stat.StatFilter.createSqlStat(StatFilter.java:648)
        at com.alibaba.druid.filter.stat.StatFilter.statementPrepareAfter(StatFilter.java:311)
        at com.alibaba.druid.filter.FilterEventAdapter.connection_prepareStatement(FilterEventAdapter.java:124)
        at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:568)
        at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.prepareStatement(ConnectionProxyImpl.java:341)
        at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:350)
        at jdk.internal.reflect.GeneratedMethodAccessor379.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:567)
        at org.apache.ibatis.logging.jdbc.ConnectionLogger.invoke(ConnectionLogger.java:55)
        at com.sun.proxy.$Proxy385.prepareStatement(Unknown Source)
        at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:86)
        at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:88)
        at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:59)
        at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:86)
        at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
        at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
        at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
        at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
        at com.github.pagehelper.util.ExecutorUtil.pageQuery(ExecutorUtil.java:177)
        at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:104)
        at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
        at com.sun.proxy.$Proxy384.query(Unknown Source)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
        at jdk.internal.reflect.GeneratedMethodAccessor425.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:567)
        at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
        at com.sun.proxy.$Proxy166.selectList(Unknown Source)
        at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)
        at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147)
        at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80)
        at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:57)
        at com.sun.proxy.$Proxy284.getTutorVirtualClassSalaryInfoList(Unknown Source)
        at 

Druid过滤器发现使用了sql默认保留的关键字 会报这个异常,在下面找到token后面的关键字对应的符号 然后在mapper中搜索 找到后使用``包裹即可

public enum Token {
    FOR("FOR"), 
    IF("IF"), 
    INDEX("INDEX"), 
    PRIMARY("PRIMARY"), 
    KEY("KEY"), 
    DEFAULT("DEFAULT"), 
    CONSTRAINT("CONSTRAINT"), 
    CHECK("CHECK"), 
    VIEW("VIEW"), 
    CREATE("CREATE"),
    ALTER("ALTER"), 
    DROP("DROP"), 
    TABLE("TABLE"), 
    UPDATE("UPDATE"), 
    SET("SET"), 
    SELECT("SELECT"), 
    FROM("FROM"), 
    WHERE("WHERE"), 
    ORDER("ORDER"), 
    BY("BY"),
    GROUP("GROUP"), 
    HAVING("HAVING"), 
    INSERT("INSERT"), 
    INTO("INTO"), 
    NULL("NULL"), 
    NOT("NOT"), 
    AS("AS"), 
    DELETE("DELETE"), 
    DISTINCT("DISTINCT"),
    UNIQUE("UNIQUE"), 
    FOREIGN("FOREIGN"), 
    REFERENCES("REFERENCES"), 
    ALL("ALL"), 
    UNION("UNION"), 
    INTERSECT("INTERSECT"), 
    MINUS("MINUS"),
    INNER("INNER"), 
    LEFT("LEFT"), 
    RIGHT("RIGHT"), 
    FULL("FULL"), 
    OUTER("OUTER"), 
    JOIN("JOIN"), 
    ON("ON"), 
    SCHEMA("SCHEMA"), 
    CAST("CAST"),
    COLUMN("COLUMN"),
    USE("USE"),
    DATABASE("DATABASE"),
 
    AND("AND"), 
    OR("OR"), 
    XOR("XOR"), 
    CASE("CASE"), 
    WHEN("WHEN"), 
    THEN("THEN"), 
    ELSE("ELSE"), 
    END("END"), 
    EXISTS("EXISTS"), 
    IN("IN"),
 
    NEW("NEW"), 
    ASC("ASC"), 
    DESC("DESC"), 
    IS("IS"), 
    LIKE("LIKE"), 
    ESCAPE("ESCAPE"), 
    BETWEEN("BETWEEN"), 
    VALUES("VALUES"), 
    INTERVAL("INTERVAL"),
 
    LOCK("LOCK"), 
    SOME("SOME"), 
    ANY("ANY"),
    TRUNCATE("TRUNCATE"),
 
    // mysql
    TRUE("TRUE"), 
    FALSE("FALSE"),
    LIMIT("LIMIT"),
    KILL("KILL"),
    IDENTIFIED("IDENTIFIED"),
    PASSWORD("PASSWORD"),
    DUAL("DUAL"),
 
    //postgresql
    WINDOW("WINDOW"),
    OFFSET("OFFSET"),
    ROW("ROW"),
    ROWS("ROWS"),
    ONLY("ONLY"),
    FIRST("FIRST"),
    NEXT("NEXT"),
    FETCH("FETCH"),
    OF("OF"),
    SHARE("SHARE"),
    NOWAIT("NOWAIT"),
    RECURSIVE("RECURSIVE"),
    TEMPORARY("TEMPORARY"),
    TEMP("TEMP"),
    UNLOGGED("UNLOGGED"),
    RESTART("RESTART"),
    IDENTITY("IDENTITY"),
    CONTINUE("CONTINUE"),
    CASCADE("CASCADE"),
    RESTRICT("RESTRICT"),
    USING("USING"),
    CURRENT("CURRENT"),
    RETURNING("RETURNING"),
    COMMENT("COMMENT"),
    OVER("OVER"),
 
    // oracle
    START("START"),
    PRIOR("PRIOR"),
    CONNECT("CONNECT"),
    WITH("WITH"),
    EXTRACT("EXTRACT"),
    CURSOR("CURSOR"),
    MODEL("MODEL"),
    MERGE("MERGE"),
    MATCHED("MATCHED"),
    ERRORS("ERRORS"),
    REJECT("REJECT"),
    UNLIMITED("UNLIMITED"),
    BEGIN("BEGIN"),
    EXCLUSIVE("EXCLUSIVE"),
    MODE("MODE"),
    WAIT("WAIT"),
    ADVISE("ADVISE"),
    SESSION("SESSION"),
    PROCEDURE("PROCEDURE"),
    LOCAL("LOCAL"),
    SYSDATE("SYSDATE"),
    DECLARE("DECLARE"),
    EXCEPTION("EXCEPTION"),
    GRANT("GRANT"),
    LOOP("LOOP"),
    GOTO("GOTO"),
    COMMIT("COMMIT"),
    SAVEPOINT("SAVEPOINT"),
    CROSS("CROSS"),
 
    // transact-sql
    TOP("TOP"),
 
    // hive
 
    EOF, 
    ERROR,
    IDENTIFIER,
    HINT,
    VARIANT,
    LITERAL_INT,
    LITERAL_FLOAT,
    LITERAL_HEX,
    LITERAL_CHARS,
    LITERAL_NCHARS,
 
    LITERAL_ALIAS,
    LINE_COMMENT,
    MULTI_LINE_COMMENT,
 
    // Oracle
    BINARY_FLOAT,
    BINARY_DOUBLE,
 
    LPAREN("("), 
    RPAREN(")"), 
    LBRACE("{"), 
    RBRACE("}"), 
    LBRACKET("["), 
    RBRACKET("]"), 
    SEMI(";"), 
    COMMA(","), 
    DOT("."), 
    DOTDOT(".."), 
    DOTDOTDOT("..,"), 
    EQ("="), 
    GT(">"), 
    LT("<"), 
    BANG("!"),
    TILDE("~"), 
    QUES("?"), 
    COLON(":"), 
    COLONEQ(":="), 
    EQEQ("=="), 
    LTEQ("<="), 
    LTEQGT("<=>"), 
    LTGT("<>"), 
    GTEQ(">="), 
    BANGEQ("!="), 
    BANGGT("!>"), 
    BANGLT("!<"),
    AMPAMP("&&"), 
    BARBAR("||"), 
    PLUS("+"), 
    SUB("-"), 
    STAR("*"), 
    SLASH("/"), 
    AMP("&"), 
    BAR("|"), 
    CARET("^"), 
    PERCENT("%"), 
    LTLT("<<"), 
    GTGT(">>"),
    MONKEYS_AT("@");
 
    public final String name;
 
    Token(){
        this(null);
    }
 
    Token(String name){
        this.name = name;
    }
}

通过已上可以将关键字加上单引号,测试是否通过。这里我实验了好几次。将name变成'name' ,所有关键字改成大写,依旧不好使。最后还是通过调整sql的查询语句才可以。

第一次 关键字大写,加双引号,不好使

WITH tmp AS (
                       (SELECT     cvi.id        AS virtualClassId,
                       cvi.start_time            AS startTime,
                       cvi.student_user_id       AS id,
                       usi.real_name             AS 'name',
                       1                         AS classType,
                       ce.id                     AS editionId,
                       ci.course_name            AS courseName,
                       cl.unit_no                AS unitNo,
                       cl.unit_lesson_no         AS unitLessonNo,
                       cvi.feedback_status       AS feedbackStatus,
                       cvi.teacher_attend_status AS teacherAttendStatus
                       FROM classroom_virtualclass_info cvi
                       INNER JOIN finance_classroom_audit fca ON fca.virtual_class_id = cvi.id
                       INNER JOIN user_student_info usi ON cvi.student_user_id = usi.id
                       INNER JOIN course_lesson cl ON cvi.lesson_id = cl.id
                       INNER JOIN course_info ci ON cl.course_id = ci.id
                       INNER JOIN course_edition ce ON ci.course_edition_id = ce.id
                       WHERE cvi.tutor_user_id = #{tutorId}
                       AND cvi.start_time &gt;= #{startTime}
                       AND cvi.start_time &lt;= #{endTime}
                       AND cvi.`remove` = 0
                       AND cvi.`status` in (3, 4)
                       AND fca.`remove` = 0
                       AND fca.class_type_id = 1)
                      UNION ALL
                       (SELECT         svi.id    AS virtualClassId,
                       svi.start_time            AS startTime,
                       svi.class_id              AS id,
                       sci.class_name_zh         AS 'name',
                       2                         AS classType,
                       ce.id                     AS editionId,
                       ci.course_name            AS courseName,
                       cl.unit_no                AS unitNo,
                       cl.unit_lesson_no         AS unitLessonNo,
                       svi.feedback_status       AS feedbackStatus,
                       svi.teacher_attend_status AS teacherAttendStatus
                       FROM smallclass_virtualclass_info svi
                       INNER JOIN finance_classroom_audit fca ON fca.virtual_class_id = svi.id
                       INNER JOIN smallclass_class_info sci ON svi.class_id = sci.id
                       INNER JOIN course_lesson cl ON svi.lesson_id = cl.id
                       INNER JOIN course_info ci ON cl.course_id = ci.id
                       INNER JOIN course_edition ce ON ci.course_edition_id = ce.id
                       WHERE svi.tutor_user_id = #{tutorId}
                       AND svi.start_time &gt;= #{startTime}
                       AND svi.start_time &lt;= #{endTime}
                       AND svi.`remove` = 0
                       AND svi.`status` IN (3, 4)
                       AND fca.`remove` = 0
                       AND fca.class_type_id = 1)
       )
       SELECT * FROM tmp  ORDER BY startTime DESC

调整查询语句才好使。

       SELECT * FROM (
(
                       (SELECT     cvi.id        AS virtualClassId,
                       cvi.start_time            AS startTime,
                       cvi.student_user_id       AS id,
                       usi.real_name             AS 'name',
                       1                         AS classType,
                       ce.id                     AS editionId,
                       ci.course_name            AS courseName,
                       cl.unit_no                AS unitNo,
                       cl.unit_lesson_no         AS unitLessonNo,
                       cvi.feedback_status       AS feedbackStatus,
                       cvi.teacher_attend_status AS teacherAttendStatus
                       FROM classroom_virtualclass_info cvi
                       INNER JOIN finance_classroom_audit fca ON fca.virtual_class_id = cvi.id
                       INNER JOIN user_student_info usi ON cvi.student_user_id = usi.id
                       INNER JOIN course_lesson cl ON cvi.lesson_id = cl.id
                       INNER JOIN course_info ci ON cl.course_id = ci.id
                       INNER JOIN course_edition ce ON ci.course_edition_id = ce.id
                       WHERE cvi.tutor_user_id = #{tutorId}
                       AND cvi.start_time &gt;= #{startTime}
                       AND cvi.start_time &lt;= #{endTime}
                       AND cvi.`remove` = 0
                       AND cvi.`status` in (3, 4)
                       AND fca.`remove` = 0
                       AND fca.class_type_id = 1)
                      UNION ALL
                       (SELECT         svi.id    AS virtualClassId,
                       svi.start_time            AS startTime,
                       svi.class_id              AS id,
                       sci.class_name_zh         AS 'name',
                       2                         AS classType,
                       ce.id                     AS editionId,
                       ci.course_name            AS courseName,
                       cl.unit_no                AS unitNo,
                       cl.unit_lesson_no         AS unitLessonNo,
                       svi.feedback_status       AS feedbackStatus,
                       svi.teacher_attend_status AS teacherAttendStatus
                       FROM smallclass_virtualclass_info svi
                       INNER JOIN finance_classroom_audit fca ON fca.virtual_class_id = svi.id
                       INNER JOIN smallclass_class_info sci ON svi.class_id = sci.id
                       INNER JOIN course_lesson cl ON svi.lesson_id = cl.id
                       INNER JOIN course_info ci ON cl.course_id = ci.id
                       INNER JOIN course_edition ce ON ci.course_edition_id = ce.id
                       WHERE svi.tutor_user_id = #{tutorId}
                       AND svi.start_time &gt;= #{startTime}
                       AND svi.start_time &lt;= #{endTime}
                       AND svi.`remove` = 0
                       AND svi.`status` IN (3, 4)
                       AND fca.`remove` = 0
                       AND fca.class_type_id = 1)
       )
)tmp  ORDER BY tmp.startTime DESC

 

<think>好的,我现在要解决用户遇到的com.alibaba.druid.sql.parser.ParserException异常问题,具体错误信息是“syntax error 'wbar.BOM_RECORD_NO) tmp_count' expect RPAREN actual RPAREN pos 651 line 19 column 39 token RPAREN”。首先,我需要理解这个错误的原因。根据用户提供的引用内容,特别是引用[3]提到的,Druid的WallFilter可能对某些SQL语法不支持,导致解析错误。而用户提供的错误信息显示在期望右括号的地方却遇到了右括号,这可能看起来矛盾,但可能是在解析过程中,Druid的解析器在某些嵌套结构或子查询中处理括号时出现了问题。 接下来,我需要分析错误的具体位置。用户指出错误发生在第19行第39列,位置651处。这个时候需要检查该位置附近的SQL代码,特别是括号的匹配情况。例如,是否有多余的括号,或者括号没有正确闭合。例如,在子查询中,可能缺少了某个括号,或者括号的位置不正确,导致解析器在预期某个符号时遇到了另一个符号。 根据引用[4]中的例子,用户因为缺少空格导致SQL语句拼接错误,比如“from CLUB_MEMBER a,CLUB c, MEMBER_ACTION_RECORD d”和后面的条件语句没有正确分隔,导致语法错误。类似地,用户的SQL可能存在类似的问题,比如在某个括号后面缺少空格,或者子查询的结构不正确。 另外,引用[3]提到,如果确认SQL在数据库客户端可以运行,可以尝试移除WallFilter的配置,以绕过Druid的语法检查。这可能是一个临时的解决方案,但需要注意安全风险,因为WallFilter用于防止SQL注入攻击。 因此,解决步骤可能包括:首先检查并修复SQL语句中的括号匹配和语法问题;其次,检查SQL语句的拼接是否正确,尤其是空格和符号的位置;如果确认SQL正确,考虑调整Druid配置,暂时禁用WallFilter,但需谨慎处理。 还需要注意,用户的具体错误信息中提到了“tmp_count”,可能是在使用别名或者子查询时,括号没有正确闭合。例如,可能在子查询的别名前缺少括号,或者括号的位置错误。比如,类似这样的结构:SELECT ... FROM (SELECT ...) tmp_count,如果这里的括号没有正确闭合,会导致解析错误。 总结可能的解决方案:检查第19行第39列附近的括号是否正确闭合,确保子查询或表达式的括号配对;检查SQL语句中的空格和语法结构;如果问题依旧,考虑升级Druid版本或调整配置。</think>### com.alibaba.druid.sql.parser.ParserException异常解决方案 #### 问题分析 错误信息 `syntax error 'wbar.BOM_RECORD_NO) tmp_count' expect RPAREN actual RPAREN` 表明 **Druid解析器在SQL语句的括号匹配或语法结构上检测到异常**,具体表现为: 1. **括号不匹配**:在子查询、函数调用或表达式中的括号未正确闭合。 2. **别名语法问题**:在子查询或表别名定义时,括号与别名之间的语法格式错误。 3. **Druid版本限制**:某些SQL语法可能不被当前Druid版本支持[^3]。 --- #### 逐步解决方案 1. **检查括号匹配** - 定位到错误位置:根据 `pos 651 line 19 column 39`,找到SQL第19行第39列附近的代码片段。 - **常见问题示例**: ```sql -- 错误示例:子查询缺少闭合括号 SELECT * FROM (SELECT a FROM table1 WHERE a > 0 tmp_count ``` ```sql -- 正确修正:补充闭合括号并添加别名关键字 SELECT * FROM (SELECT a FROM table1 WHERE a > 0) AS tmp_count ``` - 确保所有子查询或函数调用中的括号成对出现,且别名需通过 `AS` 关键字定义(部分数据库可选,但Druid解析器可能严格要求)[^1][^4]。 2. **验证SQL语法格式** - 检查表别名或子查询别名的定义: ```sql -- 错误示例:缺少AS关键字或括号与别名粘连 SELECT * FROM (SELECT ... )tmp_count ``` ```sql -- 正确修正:添加空格或AS关键字 SELECT * FROM (SELECT ... ) AS tmp_count ``` - 确保操作符(如 `=`、`,`)和关键字前后留有空格,避免粘连导致解析歧义。 3. **调整Druid配置(临时方案)** - 若确认SQL语法在数据库客户端可执行,但Druid仍报错,可能是WallFilter拦截了特定语法: ```properties # 原配置(启用WallFilter) spring.datasource.druid.filters=stat,wall,log4j # 修改后配置(移除WallFilter) spring.datasource.druid.filters=stat,log4j ``` - **注意**:移除WallFilter会降低SQL注入防护能力,建议仅作临时测试。 4. **升级Druid版本** - 旧版本Druid(如1.2.5)可能对复杂SQL支持不足,尝试升级至最新版本(如1.2.16+): ```xml <!-- Maven依赖示例 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.16</version> </dependency> ``` --- #### 示例修正 假设错误SQL片段为: ```sql SELECT * FROM (SELECT wbar.BOM_RECORD_NO FROM tableA) tmp_count ``` 修正后: ```sql SELECT * FROM (SELECT wbar.BOM_RECORD_NO FROM tableA) AS tmp_count ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万米高空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值