SQL语句包含::,使用 PagerUtils 时,抛出下面的异常
Exception in thread "main" com.alibaba.druid.sql.parser.ParserException: syntax error, expect RPAREN, actual COLONCOLON pos 61, line 1, column 60, token COLONCOLON at com.alibaba.druid.sql.parser.SQLExprParser.accept(SQLExprParser.java:2856) at com.alibaba.druid.sql.parser.SQLExprParser.methodRest(SQLExprParser.java:1419) at com.alibaba.druid.sql.parser.SQLExprParser.dotRest(SQLExprParser.java:1356) at com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerExprParser.dotRest(SQLServerExprParser.java:131) at com.alibaba.druid.sql.parser.SQLExprParser.primaryRest(SQLExprParser.java:1008) at com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerExprParser.primaryRest(SQLServerExprParser.java:120) at com.alibaba.druid.sql.parser.SQLSelectParser.parseWhere(SQLSelectParser.java:624) at com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerSelectParser.query(SQLServerSelectParser.java:172) at com.alibaba.druid.sql.parser.SQLSelectParser.query(SQLSelectParser.java:358) at com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerSelectParser.select(SQLServerSelectParser.java:57) at com.alibaba.druid.sql.parser.SQLStatementParser.parseSelect(SQLStatementParser.java:2562) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:248) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:171) at com.alibaba.druid.sql.SQLUtils.parseStatements(SQLUtils.java:492) at com.alibaba.druid.sql.SQLUtils.parseStatements(SQLUtils.java:487) at com.alibaba.druid.sql.PagerUtils.limit(PagerUtils.java:81) at com.example.test.utils.AlibabaDruid.main(AlibabaDruid.java:17)
SQL
select * from test where shape.STIntersects(geometry::STGeomFromText('POLYGON ((86610.054 86610.054,112372.95799999963 88785.5940000005,112372.91199999955 88675.996999999508,86610.054 86610.054))',0))=1;
原提问者GitHub用户cn-wwl
这个错误syntax error, expect RPAREN, actual COLONCOLON表示Druid在解析SQL语句时,报错预期右括号。
这说明Druid使用的JsqlParser无法正确解析此SQL语句。然后通过修改、简化SQL语法、升级Druid版本等手段来解决这个错误。
根据你提供的异常信息,看起来是由于SQL语句中使用了双冒号"::"的语法,而导致Druid解析器无法正确解析该语句。异常信息中指出了在语句的第1行第60列处遇到了"COLONCOLON"标记,但解析器期望的是"RPAREN"(右括号)标记。
双冒号"::"在某些数据库中通常用于类型转换或指定数据类型的操作符,但在Druid解析器中,该语法可能不受支持或需要特殊处理。
目前的解决方案是 采取替换特殊字符的形式,将::替换成COLONCOLON ,接着使用PagerUtils.limit(),生成好分页sql,再将COLONCOLON 替换成::,最后再去执行。
原回答者GitHub用户cn-wwl
这个异常是由于SQL语句中的"::"引起的。在SQL Server中,"::"用于调用某些内置函数或特定类型的方法。然而,在一些SQL解析器中,例如PagerUtils
使用的Alibaba Druid
,它无法正确地解析和处理这种语法。
要解决这个问题,你可以尝试以下几种方法之一:
将SQL语句中的"::"替换为对应的SQL Server函数或方法的标准调用方式,以便与解析器兼容。例如,将geometry::STGeomFromText()
替换为STGeomFromText(geometry)
。
不使用PagerUtils
,而是通过其他方式实现分页。你可以自己编写代码来处理分页逻辑,或者使用其他支持SQL Server语法的查询构建工具。
请注意,以上建议可能需要根据你正在使用的数据库和工具进行相应的调整。还建议查阅相关文档和资源,以了解更多关于特定解析器和工具的限制和建议。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。