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

Java Maven+Flyway+H2环境下列未找到错误排查与解决

解决H2数据库Java代码执行关联查询报列不存在的问题

针对你遇到的H2控制台执行SQL正常,但Java代码抛出org.h2.jdbc.JdbcSQLSyntaxErrorException: Column 'INWARDS.ITEM_ID' not found的问题,可按以下步骤排查解决:

  • 统一JDBC连接参数与H2控制台配置
    H2的标识符大小写处理规则与MariaDB差异较大,且控制台和Java代码的连接参数可能不一致。检查Java代码中的JDBC URL,添加大小写相关参数:

    jdbc:h2:~/your-db;CASE_INSENSITIVE_IDENTIFIERS=TRUE;DATABASE_TO_UPPER=FALSE
    

    CASE_INSENSITIVE_IDENTIFIERS=TRUE会让H2忽略标识符的大小写差异;DATABASE_TO_UPPER=FALSE禁止H2自动将表/列名转为大写,确保和迁移脚本中的定义一致。

  • 在SQL中显式包裹表/列名
    修改关联查询SQL,将表名和列名用反引号包裹,强制H2严格按照指定的标识符解析:

    SELECT i.`ITEM_ID`, o.`ORDER_NO` 
    FROM `INWARDS` i 
    JOIN `ORDERS` o ON i.`ITEM_ID` = o.`ITEM_ID`
    

    这种方式避免H2自动转换标识符的大小写,和MariaDB的解析逻辑更接近。

  • 验证迁移后表结构的实际大小写
    在H2控制台执行以下SQL,查看INWARDS表的列名实际存储的大小写:

    SELECT COLUMN_NAME, TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'INWARDS' OR TABLE_NAME = 'inwards'
    

    如果实际列名是小写的item_id,但Java代码中用了大写ITEM_ID,就会报错。此时需要调整SQL中的列名大小写,或者修改JDBC参数让H2不区分大小写。

  • 检查Flyway迁移脚本的执行环境
    确保Flyway执行迁移时使用的H2连接参数和Java代码一致。如果迁移时H2自动将列名转为小写,而Java代码用大写引用,就会出现不匹配。可以在Flyway的配置文件中指定相同的JDBC URL参数。

  • 确认H2 JDBC驱动版本兼容性
    flyway-core 10.17.0建议搭配H2 2.2.220及以上版本,避免因驱动版本不匹配导致的SQL解析差异。在Maven pom.xml中显式指定兼容版本:

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>2.2.220</version>
        <scope>runtime</scope>
    </dependency>
    

内容的提问来源于stack exchange,提问作者Saleh Rezq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:48:28