Caused by: net.sf.jsqlparser.parser.ParseException

2,696 阅读1分钟

错误异常:

Caused by: net.sf.jsqlparser.parser.ParseException: Encountered " "(" "( "" at line 3, column 11.

Was expecting one of:
    <EOF> 
    "AS" ...
    "DO" ...
    "INTO" ...
    "FROM" ...
    "WHERE" ...
    "XML" ...
    "GROUP" ...
    "VALUE" ...
    "HAVING" ...
    "REPLACE" ...
    "TRUNCATE" ...
    "CAST" ...
    "PARTITION" ...
    "EXTRACT" ...
    "MATERIALIZED" ...
    "START" ...
    "CONNECT" ...
    "SIBLINGS" ...
    "COLUMN" ...
    "NULLS" ...
    "FIRST" ...
    "LAST" ...
    "ROWS" ...
    "RANGE" ...
    "FOLLOWING" ...

部分错误异常。如果出现<EOF>标签内的内容。那么排查错误的方向都差不多。其实大家debug也可以发现问题。

由【net.sf.jsqlparser.JSQLParserException】可看出是因为组装的sql语句解析过程中抛出"非RuntimeException异常",异常被程序捕抓处理且未出现新异常,异常后的代码继续执行,所以不影响一个完整Retrieve操作。而一些"RuntimeException异常",例如:空指针(NullPointerException)、数组越界(IndexOutOfBoundsException)、类型转换(ClassCastException)等会被JVM自动处理,会在console控制台捕抓并打印异常日志。

我的mapper文件是这么写的:

        SELECT
            dept_name
        FROM
            blade_dept
        WHERE
            id IN
        <foreach collection="array" item="ids" index="index" open="(" close=")" separator=",">
            #{ids}
        </foreach>
        and is_deleted = 0
    </select>

一看就会发现是foreach标签出的问题。也就是ids为空。 所以找到谁调用的这个mapper方法。在传参数的时候判断下空值就好了。

虽然我在这里是因为前人写的代码不够严谨报的这个错误。但是大家写SQL的时候尽量不要出现函数套函数这种情况。也有可能会发生这种情况。 可以用<![CDATA[]]>这样就不会被编译。

简单记录下错误,希望能帮助到大家。如果有不足的或者有其他相似错误解决的还望大家指教。感谢各位观看。