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
相关产品推荐
相关产品推荐

