2022年3月31日,找了一下午的bug
bug 已经提交issues,详情请看GitHub,地址:https://github.com/JSQLParser/JSqlParser/issues/1504
使用JSqlparser4.3版作者提供的补丁版后解决,下载地址:https://download.csdn.net/download/qq_19749625/85099964

2022年4月9号 新增bug: JSqlParser4.3补丁版本无法解析mysql中JSON_OBJECT函数存在其它函数问题
以上问题使用JSqlparser4.4版作者提供的应急版后解决,下载地址:https://download.csdn.net/download/qq_19749625/85099990

作者提供的在线sql解析网站(访问非常慢):jsqlformatter

2022年3月31日,找了一下午的bug
异常sql:
如下方代码中所展示的那样,JSON_OBJECT函数会报ParseException异常。

// this is true
SELECT JSON_OBJECT(key person value account,key personName value account_name) obj FROM tb_review_result trr LEFT JOIN tb_person tp ON trr.account = tp.account
// this is true
SELECT JSON_OBJECT(person:account,personName:account) obj FROM tb_review_result trr LEFT JOIN tb_person tp ON trr.account = tp.account
// this is bad
SELECT JSON_OBJECT(person:trr.account,personName:tp.account) obj FROM tb_review_result trr LEFT JOIN tb_person tp ON trr.account = tp.account
// this is bad
SELECT JSON_OBJECT(person:'1',personName:'1') obj FROM tb_review_result trr LEFT JOIN tb_person tp ON trr.account = tp.account
// this is bad
SELECT JSON_OBJECT(key person value '1',key personName value '1') obj FROM tb_review_result trr LEFT JOIN tb_person tp ON trr.account = tp.account

异常:

at com.baomidou.mybatisplus.core.toolkit.ExceptionUtils.mpe(ExceptionUtils.java:39)at com.baomidou.mybatisplus.extension.parser.JsqlParserSupport.parserSingle(JsqlParserSupport.java:52)at com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor.beforeQuery(TenantLineInnerInterceptor.java:72)at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:78)at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62)at com.sun.proxy.$Proxy166.query(Unknown Source)at com.github.pagehelper.util.ExecutorUtil.executeAutoCount(ExecutorUtil.java:169)at com.github.pagehelper.PageInterceptor.count(PageInterceptor.java:178)at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:121)at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62)at com.sun.proxy.$Proxy166.query(Unknown Source)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151)... 157 more
Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "SELECT" <K_SELECT>at line 18, column 10.Was expecting one of:"!""(""NOT"at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:32047)at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:31880)at net.sf.jsqlparser.parser.CCJSqlParser.AndExpression(CCJSqlParser.java:9818)at net.sf.jsqlparser.parser.CCJSqlParser.OrExpression(CCJSqlParser.java:9757)at net.sf.jsqlparser.parser.CCJSqlParser.XorExpression(CCJSqlParser.java:9738)at net.sf.jsqlparser.parser.CCJSqlParser.AndExpression(CCJSqlParser.java:9811)at net.sf.jsqlparser.parser.CCJSqlParser.OrExpression(CCJSqlParser.java:9757)at net.sf.jsqlparser.parser.CCJSqlParser.XorExpression(CCJSqlParser.java:9738)at net.sf.jsqlparser.parser.CCJSqlParser.Expression(CCJSqlParser.java:9709)at net.sf.jsqlparser.parser.CCJSqlParser.SelectExpressionItem(CCJSqlParser.java:6338)at net.sf.jsqlparser.parser.CCJSqlParser.SelectItem(CCJSqlParser.java:6490)at net.sf.jsqlparser.parser.CCJSqlParser.SelectItemsList(CCJSqlParser.java:6328)at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:5663)at net.sf.jsqlparser.parser.CCJSqlParser.SetOperationList(CCJSqlParser.java:5892)at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:5540)at net.sf.jsqlparser.parser.CCJSqlParser.SubSelect(CCJSqlParser.java:14458)at net.sf.jsqlparser.parser.CCJSqlParser.FromItem(CCJSqlParser.java:8013)at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:5676)at net.sf.jsqlparser.parser.CCJSqlParser.SetOperationList(CCJSqlParser.java:5892)at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:5540)at net.sf.jsqlparser.parser.CCJSqlParser.SubSelect(CCJSqlParser.java:14458)at net.sf.jsqlparser.parser.CCJSqlParser.FromItem(CCJSqlParser.java:8013)at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:5676)at net.sf.jsqlparser.parser.CCJSqlParser.SetOperationList(CCJSqlParser.java:5892)at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:5540)at net.sf.jsqlparser.parser.CCJSqlParser.Select(CCJSqlParser.java:5534)at net.sf.jsqlparser.parser.CCJSqlParser.SingleStatement(CCJSqlParser.java:223)at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:144)at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatement(CCJSqlParserUtil.java:188)at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:63)at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:38)

2022年4月9号新增bug: JSqlParser4.3补丁版本无法解析mysql中JSON_OBJECT函数存在其它函数问题
以上问题使用JSqlparser4.4版作者提供的应急版后解决,下载地址:https://download.csdn.net/download/qq_19749625/85099990
异常sql如下:

SELECT JSON_ARRAYAGG(obj) FROM (SELECT trt.relevance_id,JSON_OBJECT('id',CAST(trt.id AS CHAR),'taskName',trt.task_name,'openStatus',trt.open_status,'taskSort',trt.task_sort) as obj FROM tb_review_task trt ORDER BY trt.task_sort ASC)

异常如下

Caused by: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Failed to process, Error SQL: select count(0) from (
SELECT*FROM(SELECTtct.id as relevance_id,tct.declare_id,'0' as review_type,tct.contests_name,tct.contests_level,tct.contests_type,tct.principals,tp.person_name,tct.deleted,(SELECT JSON_ARRAYAGG(obj) FROM (SELECT trt.relevance_id,JSON_OBJECT('id',CAST(trt.id AS CHAR),'taskName',trt.task_name,'openStatus',trt.open_status,'taskSort',trt.task_sort) as obj  FROM tb_review_task trt ORDER BY trt.task_sort ASC)tmp  WHERE tmp.relevance_id = tct.id)  as task_sort_list,IFNULL((SELECT COUNT(id) FROM tb_contests_apply tcp WHERE tcp.handle_id = tct.id AND tcp.contests_state = 1 AND tcp.deleted = 0),0) as total,
--         (SELECT COUNT(id) FROM tb_review_task trt WHERE trt.relevance_id = tct.id AND trt.review_type = 0 AND trt.task_sort = 1 AND trt.deleted = 0) as calculatedIFNULL((SELECT COUNT(id) FROM tb_review_total_score WHERE relevance_id = tct.id AND deleted = 0 GROUP BY apply_id),0) as calculatedFROM tb_contests_transact tctLEFT JOIN tb_person tp ON tp.account = tct.principals) tmpWHERE (deleted = ?)) tmp_countat com.baomidou.mybatisplus.core.toolkit.ExceptionUtils.mpe(ExceptionUtils.java:39)at com.baomidou.mybatisplus.extension.parser.JsqlParserSupport.parserSingle(JsqlParserSupport.java:52)at com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor.beforeQuery(TenantLineInnerInterceptor.java:72)at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:78)at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62)at com.sun.proxy.$Proxy166.query(Unknown Source)at com.github.pagehelper.util.ExecutorUtil.executeAutoCount(ExecutorUtil.java:169)at com.github.pagehelper.PageInterceptor.count(PageInterceptor.java:178)at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:121)at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62)at com.sun.proxy.$Proxy166.query(Unknown Source)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151)... 157 more
Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "SELECT" <K_SELECT>at line 18, column 10.Was expecting one of:"!""(""NOT"at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:32047)at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:31880)at net.sf.jsqlparser.parser.CCJSqlParser.AndExpression(CCJSqlParser.java:9818)at net.sf.jsqlparser.parser.CCJSqlParser.OrExpression(CCJSqlParser.java:9757)at net.sf.jsqlparser.parser.CCJSqlParser.XorExpression(CCJSqlParser.java:9738)at net.sf.jsqlparser.parser.CCJSqlParser.AndExpression(CCJSqlParser.java:9811)at net.sf.jsqlparser.parser.CCJSqlParser.OrExpression(CCJSqlParser.java:9757)at net.sf.jsqlparser.parser.CCJSqlParser.XorExpression(CCJSqlParser.java:9738)at net.sf.jsqlparser.parser.CCJSqlParser.Expression(CCJSqlParser.java:9709)at net.sf.jsqlparser.parser.CCJSqlParser.SelectExpressionItem(CCJSqlParser.java:6338)at net.sf.jsqlparser.parser.CCJSqlParser.SelectItem(CCJSqlParser.java:6490)at net.sf.jsqlparser.parser.CCJSqlParser.SelectItemsList(CCJSqlParser.java:6328)at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:5663)at net.sf.jsqlparser.parser.CCJSqlParser.SetOperationList(CCJSqlParser.java:5892)at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:5540)at net.sf.jsqlparser.parser.CCJSqlParser.SubSelect(CCJSqlParser.java:14458)at net.sf.jsqlparser.parser.CCJSqlParser.FromItem(CCJSqlParser.java:8013)at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:5676)at net.sf.jsqlparser.parser.CCJSqlParser.SetOperationList(CCJSqlParser.java:5892)at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:5540)at net.sf.jsqlparser.parser.CCJSqlParser.SubSelect(CCJSqlParser.java:14458)at net.sf.jsqlparser.parser.CCJSqlParser.FromItem(CCJSqlParser.java:8013)at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:5676)at net.sf.jsqlparser.parser.CCJSqlParser.SetOperationList(CCJSqlParser.java:5892)at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:5540)at net.sf.jsqlparser.parser.CCJSqlParser.Select(CCJSqlParser.java:5534)at net.sf.jsqlparser.parser.CCJSqlParser.SingleStatement(CCJSqlParser.java:223)at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:144)at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatement(CCJSqlParserUtil.java:188)at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:63)at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:38)




Supported Standard Compliant Syntax is shown here.// this was the correct syntax
SELECT JSON_OBJECT(key 'account' value account_col) as obj FROM tb_team;// this was also the correct syntax
SELECT JSON_OBJECT(key account :  account_col) as obj FROM tb_team;// this was also the correct syntax
SELECT JSON_OBJECT( account : account_col) as obj FROM tb_team;// this is success sql
SELECT JSON_OBJECT('account','some string') as obj FROM tb_team;
You can test it here online

老外给的答案,经过测试,可信、可行、可用,但是数据库连接工具会报错

记录一次bug
在mybatis-plus中使用拦截器时,一般都会使用到jsqlParser解析器,但是这个解析器还无法识别JSON_OBJECT函数中存在表字段问题,虽然4.3版本中已经增加了对JSON_OBJECT函数的关键词支持,并没有对JSON_OBJECT中使用表字段增加支持

为了让老外看到懂,我还用辣鸡英语写了一份英文版的,在GitHub上提iss…了
Mysql version: 8.0

JSQLParser verison: 4.3

sql example:

// this is bad sql
SELECT JSON_OBJECT('account',account) as obj FROM tb_team;// this is success sql
SELECT JSON_OBJECT('account','some string') as obj FROM tb_team;

bad sql exception:

DDL

CREATE TABLE `tb_team` (`id` bigint(20) NOT NULL COMMENT '雪花id',`process_instance_id` varchar(64) DEFAULT NULL COMMENT '流程id',`relevance_id` bigint(20) DEFAULT NULL COMMENT '发布id',`apply_id` bigint(20) DEFAULT NULL COMMENT '报名id',`account` varchar(32) DEFAULT NULL COMMENT '学工号',`originator` varchar(32) DEFAULT NULL COMMENT '发起人',`team_type` tinyint(4) DEFAULT NULL COMMENT '类型',`member_type` tinyint(4) DEFAULT NULL COMMENT '成员类型',`join_type` tinyint(4) DEFAULT NULL COMMENT '加入类型',`open_status` tinyint(4) DEFAULT NULL COMMENT '成员状态',`creator` varchar(64) DEFAULT NULL COMMENT '创建者',`updater` varchar(64) DEFAULT NULL COMMENT '修改者',`update_time` datetime DEFAULT NULL COMMENT '修改时间',`deleted` bit(1) DEFAULT b'0' COMMENT '删除标志',`tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',`create_time` datetime DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='队伍成员表';

An exception will occur if the ‘account’ column comes from the tb_team table

JSqlParser4.3版本无法解析mysql中JSON_OBJECT函数抛出ParseException异常相关推荐

  1. java中主函数抛出的异常怎么解决_java – 从递归函数中抛出异常

    我为一个更大的应用程序构建了一个库/模块,它从函数中抛出异常.如果找不到文件或文件包含错误格式,则抛出Exeption. 该方法看起来像: Shape parse(String path) throw ...

  2. springBoot 在过滤器中如何捕获抛出的异常并自定义返回信息

    一般springBoot自带的全局异常捕获机制都是在业务层发生的异常来进行捕获的,因为过滤器的执行顺序是在全局异常机制启动之前执行的,所以一旦过滤器中发生异常,全局异常捕获机制无法使用 现在有一个围魏 ...

  3. java 异常 不抛_java中的不抛出的异常是什么

    RuntimeException与其子类和错误(Error)不是必须要捕获或抛出. Java异常Throwable分为两类:Error和Exception,Error类是错误,程序本身不能处理的. E ...

  4. mysql中concat函数的使用相关总结

    concat(str1,str2) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. mysql> select concat('11','22','33') ...

  5. Oracle中concat与||区别(以及与mysql中concat函数区别)

    Oracle中concat使用以及与||区别 CONCAT只能连接两个字符串 The syntax for the concat function is: concat( string1, strin ...

  6. mysql中合并函数_MYSQL分组合并函数

    MySQL中group_concat函数 完整的语法如下: group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔 ...

  7. mysql中find_in_set()函数的使用及in()用法详解

    From: http://www.manongjc.com/article/2710.html MySQL手册中find_in_set函数的语法解释: FIND_IN_SET(str,strlist) ...

  8. MySQL中concat函数(连接字符串)

    MySQL中concat函数(连接字符串) MySQL中concat函数 使用方法: concat(str1,str2,-) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 ...

  9. mysql必会语法_sql语法:sql必读必会(二)mysql中的函数大全

    AVG 函数 作用:AVG 函数返回数值列的平均值.NULL 值不包括在计算中 语法:SELECT AVG(列) FROM 表 求id平均值(实在没字段了,就是意思意思) id大于平均值的记录 COU ...

最新文章

  1. mysql数据库-主主配置
  2. 计算机科学与技术的程序设计基础,程序设计基础
  3. 会计电算化练习题目(模拟练习8)
  4. index加载显示servlet数据_[WEB篇]-JavaWeb基础与应用-02-Servlet开发
  5. python中随机输入数字再排序
  6. matlab保存并关闭excel文件夹,[转载]Matlab批量操作目标文件夹下的Excel文件
  7. python读取二进制数据转整形,在python中读取二进制数据(替换C代码)
  8. redis返回的结果是null_Spring AOP 用注解封装 redis 缓存
  9. ORACLE decode
  10. Java敏捷开发框架
  11. 超详细的SFtp工具类及使用
  12. tomcat 服务器启动异常 报错
  13. AppCode开发,一个智能开发环境
  14. JSzip 前端处理下载打包文件夹
  15. 普通年金终值和现值计算(白话版)
  16. linux查看etc下yam文件,在Linux上用Netplan进行网络配置
  17. python 类属性函数,python_30期【类包含属性和函数】
  18. Python 图像处理OpenCV:直方图均衡化(笔记)
  19. 自建ES通过OSS快照迁移至阿里云ES
  20. mfc使用键盘加速键

热门文章

  1. 操作系统——读者写者问题
  2. 软件测试之测试人员的分工
  3. 2022年电工低压电工作业(应急管理厅)判断题及答案
  4. 需求工程之软件需求规格文档(SRS文档)
  5. 孩子科技特长生学什么比较好?当然是编程课
  6. LTE学习理解系列——利用matlab工具生成4G LTE信源
  7. vs code设置快捷键模式为eclipse的快捷键
  8. linux以太网连接树莓派,树莓派 Zero USB/以太网方式连接配置教程,树莓zero
  9. 2023年【熔化焊接与热切割】考试及熔化焊接与热切割考试技巧
  10. 算法设计与分析-回溯法