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

JOOQ配置强制类型后仍以VARCHAR插入PostgreSQL枚举列问题

问题与解决

问题详情

在PostgreSQL 12中创建自定义枚举类型:

CREATE TYPE some_type AS ENUM ('YES', 'NO', 'MAYBE');

对应Kotlin枚举类:

enum class SomeType {
    YES, NO, MAYBE;
}

Gradle Kotlin脚本中配置jOOQ强制类型转换:

forcedTypes = listOf(
    ForcedType().apply {
        setUserType("com.example.SomeType")
        setEnumConverter(true)
        setIncludeExpression("column_a")
    },
)

执行批量插入代码时:

val query = insertInto(TABLE_NAME)
                .columns(COLUMN_A)
                .values(MAYBE, LocalDateTime.now())
                .onDuplicateKeyUpdate()
                .set(COLUMN_A, YES)

query.bind(YES).executeAsync()

生成的代码是类型安全的(COLUMN_A为Field<SomeType>),但运行时抛出错误:

ERROR: column "column_a" is of type some_type but expression is of type character varying
  Hint: You will need to rewrite or cast the expression.

调试发现Prepared Query发送的是VARCHAR值,而非PostgreSQL期望的枚举类型。

解决方案

问题出在jOOQ配置中未明确指定字段对应的PostgreSQL枚举数据类型,导致jOOQ仅做了Java枚举到字符串的转换,没有告知数据库该值属于自定义枚举类型。

修改Gradle中的强制类型配置,新增setDataType("some_type"):

forcedTypes = listOf(
    ForcedType().apply {
        setUserType("com.example.SomeType")
        setEnumConverter(true)
        setIncludeExpression("column_a")
        // 指定对应PostgreSQL端的枚举类型名称
        setDataType("some_type")
    },
)

修改配置后,需要重新运行jOOQ的代码生成任务,确保生成的字段绑定逻辑包含正确的类型映射。

这样jOOQ会在发送SQL参数时,将SomeType枚举值按照PostgreSQL的some_type类型处理,而非默认的VARCHAR,解决类型不匹配的问题。

内容的提问来源于stack exchange,提问作者Mangat Rai Modi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:11:12