问题
控制台输出以下信息:
Tip:这是经过调整的sql,但是足以拿来描述这个问题了
2023-06-20 13:46:30.496 WARN 5204 --- [io-17310-exec-8]c.b.m.e.p.i.PaginationInnerInterceptor: optimize this sql to a count sql has exception,
sql:"
SELECT
A.*, B.total, B.normal, B.except
FROM A
LEFT JOIN
(
SELECT
trip_id,
sum(IF(event_type in (1, 2), 1,0)) as total,
sum(IF(event_type in (1, 2) and event_value = 1, 1,0)) as except,
sum(IF(event_type in (1, 2) and event_value != 1, 1,0)) as normal
from event_push WHERE upload_status = 1
GROUP BY trip_id
) B on B.trip_id = A.trip_id
ORDER BY A.start_date desc , D.metro_train_num desc
", exception: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "." "." at line xx, column xx.
Was expecting one of:
"ACTION"
"ACTIVE"
"ALGORITHM"
"ARCHIVE"
"ARRAY"
"AT"
"BYTE"
"CASCADE"
"CASE"
"CAST"
"CHANGE"
"CHAR"
"CHARACTER"
"CHECKPOINT"
"COLUMN"
"COLUMNS"
"COMMENT"
"COMMIT"
"COSTS"
"CYCLE"
"DBA_RECYCLEBIN"
"DESC"
"DESCRIBE"
"DISABLE"
"DISCONNECT"
"DIV"
"DO"
"DUMP"
"DUPLICATE"
"ENABLE"
"END"
"EXCLUDE"
"EXTRACT"
"FALSE"
"FILTER"
"FIRST"
"FLUSH"
"FN"
"FOLLOWING"
"FORMAT"
"FULLTEXT"
"HISTORY"
"INDEX"
"INSERT"
"INTERVAL"
"ISNULL"
"JSON"
"KEY"
"LAST"
"LEADING"
"LINK"
"LOCAL"
"LOG"
"MATERIALIZED"
"NO"
"NOLOCK"
"NULLS"
"OF"
"OPEN"
"OVER"
"PARALLEL"
"PARTITION"
"PATH"
"PERCENT"
"PRECISION"
"PRIMARY"
"PRIOR"
"QUERY"
"QUIESCE"
"RANGE"
"READ"
"RECYCLEBIN"
"REGISTER"
"REPLACE"
"RESTRICTED"
"RESUME"
"ROW"
"ROWS"
"SCHEMA"
"SEPARATOR"
"SEQUENCE"
"SESSION"
"SHUTDOWN"
"SIBLINGS"
"SIGNED"
"SIZE"
"SKIP"
"SUSPEND"
"SWITCH"
"SYNONYM"
"SYSTEM"
"TABLE"
"TABLESPACE"
"TEMP"
"TEMPORARY"
"TIMEOUT"
"TO"
"TOP"
"TRUE"
"TRUNCATE"
"TRY_CAST"
"TYPE"
"UNQIESCE"
"UNSIGNED"
"USER"
"VALIDATE"
"VALUE"
"VALUES"
"VIEW"
"XML"
"ZONE"
<K_DATETIMELITERAL>
<K_DATE_LITERAL>
<K_NEXTVAL>
<K_STRING_FUNCTION_NAME>
<S_CHAR_LITERAL>
<S_IDENTIFIER>
<S_QUOTED_IDENTIFIER>
解决
首先这是一个警告,我们可以选择不处理,但无奈有强迫症啊。
有文章说在Mapper接口上添加注解@SqlParser(filter=true),但是我这根本检索不到这个注解~。
也有文章说项目里同时存在mybatis-plus和pagehelper,它们都有jsqlparser依赖,是jsqlparser版本依赖冲突问题,但是我这并没有引入pagehelper~
还有文章说这是mybatis-plus版本问题,升级到v3.5.1就可以了,但是我项目的mybatis-plus就是这个版本啊~。
也有一些文章说是与MySQL关键字有关,所以我尝试着把sql中的所有与关键字、保留字等相同的都用``符号包裹着,发现就不再输出这个警告了,到此原因就找到了。
最后,还找到了一篇很值得参考的文章,它给出了手写sql和mybatis-plus自带查询的对应解决办法。对于mybatis-plus自带查询,还有文章说可以在字段上使用这种形式@TableField("`fieldName`"),但我没尝试过这种方法。
Tip:在测试过程中发现,当与MySQL关键字冲突的字段很少时,提示的信息其实比较明确。例如出现
ParseException: Encountered unexpected token: "except" "EXCEPT" at line 41, column 67,这是告诉我们sql中except字段是关键字,产生冲突了。