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
相关产品推荐
相关产品推荐

