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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:14:57