执行简单SELECT查询报java.sql.SQLException第3位存在不支持SQL92令牌错误
报错原因
- 最核心的诱因是你查询的字段名
contract属于当前使用数据库的SQL92保留关键字,语法解析时将该字段名识别为非法token,报错位置3对应SQL解析后的语法单元位置,正好落在contract字段定义的区间。 - 次要可能是
sql.properties配置文件中FETCH.CONTRACT的配置值前后存在不可见特殊字符(比如复制粘贴带入的零宽空格、换行符、多余转义符),导致读取到的SQL字符串不符合语法规范。 - 也有可能是JDBC驱动版本与数据库版本不匹配,或者连接池开启了严格SQL92语法校验规则,对兼容语法的支持度不足。
解决方案
- 优先处理保留关键字冲突:给字段名加上对应数据库的标识符包裹符,MySQL使用反引号,Oracle、PostgreSQL使用双引号,修改后的SQL如下:
-- MySQL版本 SELECT `contract` FROM contract_table -- Oracle/PostgreSQL版本 SELECT "contract" FROM contract_table
同步修改sql.properties中的FETCH.CONTRACT配置值即可。
- 清理配置文件内容:删除
sql.properties中FETCH.CONTRACT的整行配置,手动重新输入配置内容,避免隐藏特殊字符的影响,同时确认配置文件编码为UTF-8无BOM格式。 - 校验依赖版本匹配:确认使用的JDBC驱动版本与数据库大版本一致,关闭连接池中不必要的严格SQL语法校验规则。
- 代码优化(可选):你已经引入了Spring JdbcTemplate,无需手动管理连接、Statement、结果集资源,直接使用封装好的query方法即可,避免资源泄露风险,修改后的代码示例:
public List<ContractEntity> getValue(){ return jdbc.query(fetchContract, new BeanPropertyRowMapper<>(ContractEntity.class)); }
内容的提问来源于stack exchange,提问作者Nismath vi
相关产品推荐
相关产品推荐

