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

如何通过jOOQ元数据API获取枚举字段的正确类型与可空性信息

jOOQ元数据API无法正确识别PostgreSQL枚举字段的类型与可空性问题

问题场景

使用jOOQ的元数据API查询PostgreSQL数据库时,多数字段的类型、可空性信息都能正常获取,但枚举类型字段存在异常。

数据库Schema定义

CREATE TYPE public.my_enum AS ENUM (
    'foo',
    'bar',
    'baz'
);

CREATE TABLE public.my_table (
    id bigint NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    name text,
    my_enum_column public.my_enum NOT NULL,
);

测试代码与现象

以下Kotlin测试用例可复现问题:

test("something fishy going on here") {
    val jooq = DSL.using(myDataSource, SQLDialect.POSTGRES)
    val myTable = jooq.meta().tables.find { it.name == "my_table" }!!

    // 非枚举字段表现正常
    val createdAt = myTable.field("created_at")!!
    createdAt.dataType.nullability() shouldBe Nullability.NOT_NULL
    createdAt.dataType.typeName shouldBe "timestamp with time zone"

    // 枚举字段表现异常
    val myEnumField = myTable.field("my_enum_column")!!
    myEnumField.dataType.typeName shouldBe "other"
    myEnumField.dataType.nullability() shouldBe Nullability.DEFAULT
    myEnumField.dataType.castTypeName shouldBe "other"
    myEnumField.type shouldBe Any::class.java
}

具体问题表现

  • 可空性异常:无论枚举列是否设置为NOT NULL,Field.dataType.nullability()始终返回Nullability.DEFAULT,而非枚举列能正确返回对应可空状态。
  • 类型信息异常:枚举列的type始终为Any,dataType.typeName返回"other",无法识别出实际的枚举类型;而非枚举列能正常返回正确的SQL类型名。

对比:jOOQ代码生成器表现正常

jOOQ代码生成器能正确识别枚举列的类型与可空性,生成的字段代码如下(格式调整后):

public final TableField<MyTableRecord, MyEnum> MY_ENUM_COLUMN =
    createField(
        DSL.name("my_enum_column"),
        SQLDataType.VARCHAR
            .nullable(false)
            .asEnumDataType(com.example.schema.enums.MyEnum.class),
        this,
        ""
    )

版本测试与Bug进展

  • 使用org.jooq:jooq:3.14.11 + postgres:11-alpine时,上述两个问题都存在。
  • 升级到org.jooq:jooq:3.16.10或3.17.4后,可空性问题被修复,但类型信息仍无法正确获取(typeName还是"other",type为Any)。
  • 已确认这是jOOQ的Bug,并提交了官方议题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:10:29