ParseException: Encountered unexpected token: "." "."

2,218 阅读2分钟

问题

控制台输出以下信息:

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字段是关键字,产生冲突了。