开发者社区> 问答> 正文

jdbcTemplate一直报错syntax error: ERROR. token : FUNCT

一个简单的查询语句,其他查询语句都是OK的

Caused by: java.sql.SQLException: sql injection violation, syntax error: ERROR. token : FUNCTION, pos : 163 : SELECT function_id, parent_id, class, display_order, fullname, description, target, function_type FROM function at com.alibaba.druid.wall.WallFilter.check(WallFilter.java:711) ~[druid-1.0.15.jar:1.0.15] at com.alibaba.druid.wall.WallFilter.connection_prepareStatement(WallFilter.java:240) ~[druid-1.0.15.jar:1.0.15] at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:448) ~[druid-1.0.15.jar:na] at com.alibaba.druid.filter.FilterAdapter.connection_prepareStatement(FilterAdapter.java:928) ~[druid-1.0.15.jar:na] at com.alibaba.druid.filter.FilterEventAdapter.connection_prepareStatement(FilterEventAdapter.java:122) ~[druid-1.0.15.jar:na] at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:448) ~[druid-1.0.15.jar:na] at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.prepareStatement(ConnectionProxyImpl.java:342) ~[druid-1.0.15.jar:na] at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:318) ~[druid-1.0.15.jar:1.0.15] at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.createPreparedStatement(PreparedStatementCreatorFactory.java:238) ~[spring-jdbc-4.1.6.RELEASE.jar:4.1.6.RELEASE] at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:638) ~[spring-jdbc-4.1.6.RELEASE.jar:4.1.6.RELEASE] ... 70 common frames omitted Caused by: com.alibaba.druid.sql.parser.ParserException: ERROR. token : FUNCTION, pos : 163 at com.alibaba.druid.sql.parser.SQLExprParser.primary(SQLExprParser.java:555) ~[druid-1.0.15.jar:na] at com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser.primary(MySqlExprParser.java:166) ~[druid-1.0.15.jar:1.0.15] at com.alibaba.druid.sql.parser.SQLExprParser.expr(SQLExprParser.java:121) ~[druid-1.0.15.jar:na] at com.alibaba.druid.sql.parser.SQLSelectParser.expr(SQLSelectParser.java:435) ~[druid-1.0.15.jar:na] at com.alibaba.druid.sql.parser.SQLSelectParser.parseTableSourceQueryTableExpr(SQLSelectParser.java:339) ~[druid-1.0.15.jar:na] at com.alibaba.druid.sql.parser.SQLSelectParser.parseTableSource(SQLSelectParser.java:327) ~[druid-1.0.15.jar:na] at com.alibaba.druid.sql.parser.SQLSelectParser.parseFrom(SQLSelectParser.java:294) ~[druid-1.0.15.jar:na] at com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser.query(MySqlSelectParser.java:132) ~[druid-1.0.15.jar:1.0.15] at com.alibaba.druid.sql.parser.SQLSelectParser.select(SQLSelectParser.java:60) ~[druid-1.0.15.jar:na] at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseSelect(MySqlStatementParser.java:195) ~[druid-1.0.15.jar:1.0.15] at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:144) ~[druid-1.0.15.jar:na] at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:120) ~[druid-1.0.15.jar:na] at com.alibaba.druid.wall.WallProvider.checkInternal(WallProvider.java:620) ~[druid-1.0.15.jar:1.0.15] at com.alibaba.druid.wall.WallProvider.check(WallProvider.java:574) ~[druid-1.0.15.jar:1.0.15] at com.alibaba.druid.wall.WallFilter.check(WallFilter.java:699) ~[druid-1.0.15.jar:1.0.15] at com.alibaba.druid.wall.WallFilter.connection_prepareStatement(WallFilter.java:240) ~[druid-1.0.15.jar:1.0.15] at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:448) ~[druid-1.0.15.jar:na] at com.alibaba.druid.filter.FilterAdapter.connection_prepareStatement(FilterAdapter.java:928) ~[druid-1.0.15.jar:na] at com.alibaba.druid.filter.FilterEventAdapter.connection_prepareStatement(FilterEventAdapter.java:122) ~[druid-1.0.15.jar:na] at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:448) ~[druid-1.0.15.jar:na] at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.prepareStatement(ConnectionProxyImpl.java:342) ~[druid-1.0.15.jar:na] at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:318) ~[druid-1.0.15.jar:1.0.15] at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.createPreparedStatement(PreparedStatementCreatorFactory.java:238) ~[spring-jdbc-4.1.6.RELEASE.jar:4.1.6.RELEASE] at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:638) ~[spring-jdbc-4.1.6.RELEASE.jar:4.1.6.RELEASE] at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:695) ~[spring-jdbc-4.1.6.RELEASE.jar:4.1.6.RELEASE] at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:722) ~[spring-jdbc-4.1.6.RELEASE.jar:4.1.6.RELEASE] at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:772) ~[spring-jdbc-4.1.6.RELEASE.jar:4.1.6.RELEASE] at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:192) ~[spring-jdbc-4.1.6.RELEASE.jar:na] ... 65 common frames omitted

原提问者GitHub用户shaoxy

展开
收起
山海行 2023-07-05 22:07:12 94 0
4 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    在使用jdbcTemplate执行SQL语句时,如果出现类似 "syntax error: ERROR. token : FUNCT" 这样的错误,有可能是SQL语句本身存在语法错误或者参数绑定出现了问题。

    首先,您可以检查SQL语句的语法是否正确。在SQL语句中可能存在拼写错误、缺少关键字或者括号不匹配等问题,这些都可能导致语法错误。您可以将SQL语句复制到SQL编辑器中,进行语法检查和运行测试,以确认SQL语句的正确性。

    其次,您可以检查SQL语句中的参数绑定是否正确。在使用jdbcTemplate执行SQL语句时,通常使用"?"占位符来表示参数,然后使用SqlParameterSource或Object[]数组等方式将参数值绑定到SQL语句中。如果参数绑定出现了问题,比如参数个数不匹配、参数类型错误等,都可能导致语法错误。您可以检查参数绑定的代码,确保参数个数和类型与SQL语句的要求一致。

    2023-07-29 23:09:27
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    这个错误是由于sql注入检查机制导致的。Druid是一个流行的数据库连接池和监控工具,它提供了一些安全特性,其中之一就是防止SQL注入攻击。

    根据错误消息,可以看到Druid的WallFilter在检查你的SQL语句时发现了一个语法错误。错误消息中提到了一个"FUNCTION"的标记,这可能是你查询语句中的某个函数名称或关键字。

    要解决这个问题,你可以尝试以下几种方法:

    1. 检查查询语句:仔细检查你的查询语句,确保没有语法错误或拼写错误。特别注意函数名称和关键字的正确性。

    2. 使用参数化查询:使用JdbcTemplate的参数化查询功能,而不是直接将查询条件拼接到SQL语句中。这样可以避免SQL注入攻击,并且可以更好地保护你的应用程序。

    3. 调整Druid的配置:如果你确定查询语句没有问题,并且Druid的WallFilter误报了SQL注入风险,你可以尝试调整Druid的配置,禁用或调整SQL注入检查的规则。具体的配置方法可以参考Druid的文档或官方网站。

    需要注意的是,SQL注入是一种严重的安全漏洞,可以导致应用程序受到攻击或数据泄露。因此,在解决这个问题时,确保你的查询语句是安全的,并采取适当的安全措施来保护你的应用程序。

    2023-07-07 14:59:11
    赞同 展开评论 打赏
  • FUNCTION 在mysql中是关键字,不知道是否能直接这样用,你用反单引号把function括起来看看? 注意是反单引号,不是单引号。

    原回答者GitHub用户gonedays

    2023-07-06 12:44:26
    赞同 展开评论 打赏
  • 根据错误日志,报错的原因是SQL语句中存在一个不被支持的函数或表达式。错误信息指出了在"SELECT function_id, parent_id, class, display_order, fullname, description, target, function_type FROM function"这部分代码中发现了一个名为FUNCTION的标记。

    根据您提供的信息,Druid解析器无法正确解析该SQL语句,并抛出了一个解析异常。这可能是因为Druid无法识别"function"作为表名或函数名,或者Druid对某些特定的函数或表达式有限制。

    要解决这个问题,您可以尝试以下几个步骤:

    1. 检查SQL语句是否正确:检查语句中的表名、列名、函数名以及其他语法元素是否正确拼写和使用。确保没有缺失、多余或错误的标点符号。

    2. 检查数据库对象的命名规范:确保数据库对象(表、列、函数等)的命名符合数据库的命名规范。不同的数据库引擎可能对于命名规范有所差异,例如大小写敏感性、保留字等。

    3. 尝试使用其他方式实现相同的功能:如果无法解决语法错误,考虑使用其他方法或技术来实现您想要的查询逻辑。例如,您可以尝试使用其他方式查询目标表或函数,或者使用其他函数替代不被支持的函数。

    2023-07-06 08:43:57
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载