如何通过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
相关产品推荐
相关产品推荐

