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

JOOQ H2(DDLDatabase)代码生成失败:KEY为保留字问题

问题:H2新版本中KEY作为保留字导致JOOQ代码生成失败

在H2数据库新版本中,KEY被设为保留字。按照JOOQ的DDL代码生成流程操作时,由于部分表存在名为KEY的列,代码生成失败,报错信息如下:

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "create table if not exists FACT_ORDER ([*]KEY varchar not null, ...)"; expected "identifier";
SQL statement:
create table if not exists FACT_ORDER (KEY varchar not null, ...) [42001-214]

当前存在以下限制:

  • 无法重命名KEY列
  • 对应的SQL DDL文件被Liquibase占用,无法直接编辑

已尝试但无效的方案

H2提供了SET NON_KEYWORDS KEY命令,可将KEY设为非保留字。将该命令添加到JOOQ生成器配置后,问题依然存在,配置代码如下:

val target = new Target();
target.setPackageName("com.mycompany.codegen.orderdb");
target.setDirectory(targetPath);
val generator =
    new Generator()
        .withDatabase(
            new Database()
                .withName("org.jooq.meta.extensions.ddl.DDLDatabase")
                .withProperties(
                    new Property().withKey("sql").withValue("SET NON_KEYWORDS KEY;"),
                    new Property().withKey("scripts").withValue(tempDir + "/*.sql"),
                    new Property().withKey("sort").withValue("alphanumeric")))
        .withTarget(target);
val generate = new Generate();
generate.setPojos(true);
generate.setRecords(true);
generate.setPojosEqualsAndHashCode(true);
generate.setFluentSetters(true);
generator.setGenerate(generate);
GenerationTool.generate(
    new Configuration().withGenerator(generator).withLogging(getLogLevel()));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:37:17