错误异常:
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[]]>
这样就不会被编译。
简单记录下错误,希望能帮助到大家。如果有不足的或者有其他相似错误解决的还望大家指教。感谢各位观看。