You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot JdbcTemplate查询报错:表名自动转大写致表不存在

解决Spring Boot JdbcTemplate查询时表名被转大写导致的表不存在问题

问题背景

使用JdbcTemplate执行多表左连接的复杂查询(无法通过Repository接口实现),数据库采用AWS RDS MySQL,但执行查询时Spring Boot JPA自动将表名转换为大写,抛出表不存在的错误。

异常信息

路径[]抛出异常[请求处理失败;嵌套异常为org.springframework.jdbc.BadSqlGrammarException: StatementCallback;SQL语法错误[SELECT DISTINCT test_desc FROM `test_name_table`];嵌套异常为org.h2.jdbc.JdbcSQLSyntaxErrorException: 表"TEST_NAME_TABLE"不存在;SQL语句:
SELECT DISTINCT test_desc FROM `test_name_table` [42102-200]],根本原因为
org.h2.jdbc.JdbcSQLSyntaxErrorException: 表"TEST_NAME_TABLE"不存在;SQL语句:
SELECT DISTINCT test_desc FROM `test_name_table` [42102-200]

已尝试的无效方案

  • 在application.properties中配置:
    spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
    spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.DefaultNamingStrategy
    
  • 数据库URL添加参数:
    spring.datasource.dataSourceProperties.serverName=test-instance.us-east-1.rds.amazonaws.com;DATABASE_TO_UPPER=FALSE;CASE_INSENSITIVE_IDENTIFIERS=TRUE;
    
  • 在SQL查询中用反引号包裹表名
  • 将MySQL中的表名重命名为TEST_NAME_TABLE

可行解决方案

1. 优先排查:确认实际连接的数据库类型

异常中出现org.h2.jdbc.JdbcSQLSyntaxErrorException,说明应用当前连接的是H2内存数据库,而非配置的AWS RDS MySQL。需做以下检查:

  • 查看application.properties/application.yml,确认spring.datasource.url是否指向MySQL的JDBC地址,而非H2的jdbc:h2:mem:地址
  • 检查项目依赖(Maven的pom.xml或Gradle的build.gradle),移除误引入的H2数据库依赖,避免启动时自动连接H2

2. 修正MySQL表名大小写配置(确认连接MySQL后)

调整Hibernate命名策略

保留正确的物理命名策略,移除已废弃的配置:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
# 移除 spring.jpa.hibernate.naming_strategy 这个已废弃的配置项

修正数据库URL参数

MySQL的URL参数使用&分隔,添加lower_case_table_names=1参数强制表名小写处理:

spring.datasource.url=jdbc:mysql://test-instance.us-east-1.rds.amazonaws.com:3306/your_database_name?useSSL=false&serverTimezone=UTC&lower_case_table_names=1

检查AWS RDS参数组

登录AWS控制台,查看RDS MySQL实例的参数组,确认lower_case_table_names设置为1(Linux环境下MySQL默认是0,需手动调整)

3. 确保SQL语句表名一致性

直接使用与数据库中完全一致的表名(比如数据库中是小写test_name_table,SQL中就写test_name_table),无需额外添加反引号(若数据库表名含特殊字符除外)

内容的提问来源于stack exchange,提问作者Alagesan Palani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:21:29