Spring Boot集成H2内存数据库时出现SQL语法错误求助
问题排查与解决方案
核心问题1:SQL语法错误
TRANSACTION是SQL标准保留关键字,直接执行SELECT * FROM TRANSACTION会触发语法错误。H2数据库要求对关键字表名使用标识符引号包裹。
修复方案
修改TransactionRepository中的SQL语句,用双引号包裹表名:
public List<Transaction> findAll() { return jdbcClient.sql("SELECT * FROM \"TRANSACTION\"") .query(Transaction.class) .list(); }
核心问题2:数据库字段与Record属性的映射不匹配
数据库字段采用下划线命名(如transaction_name、t_date、transaction_type),但Transaction record使用驼峰命名(transactionName、tDate、type),JdbcClient默认无法自动完成映射,会导致字段值无法正确填充到record对象中。
修复方案(二选一)
方案A:SQL查询字段添加别名
在SQL中为下划线字段指定驼峰别名,匹配record属性名:
public List<Transaction> findAll() { String sql = """ SELECT id, transaction_name AS transactionName, t_date AS tDate, cost, transaction_type AS type FROM "TRANSACTION" """; return jdbcClient.sql(sql) .query(Transaction.class) .list(); }
方案B:配置全局驼峰转下划线命名策略
在application.properties(或application.yml)中添加配置,让Spring自动处理命名转换:
spring.jdbc.naming-strategy=CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
配置后,JdbcClient会自动将record的驼峰属性名转换为下划线字段名进行匹配,无需修改SQL。
额外注意:枚举类型转换
确保TransactionType枚举的常量名称与数据库中transaction_type字段的值完全一致(如数据库中的EXPENDITURE对应枚举的EXPENDITURE常量)。如果存在大小写不一致或命名差异,需要自定义枚举转换器,或者在SQL中做转换处理。
内容的提问来源于stack exchange,提问作者Venkatesh B
相关产品推荐
相关产品推荐

