JOOQ无法识别Postgres枚举类型问题求助
解决JOOQ无法识别自定义Kotlin枚举映射PostgreSQL枚举的问题
问题核心在于:你自己定义的SomeType枚举,和JOOQ根据PostgreSQL枚举生成的SomeType是两个完全独立的类。JOOQ的表字段SOME.TYPE期望接收的是实现了EnumType接口的JOOQ生成枚举实例,而非你自己写的简单枚举,所以才会出现识别失败的情况。
下面是三种可行的解决办法:
办法1:直接使用JOOQ生成的枚举
删掉你自己定义的SomeType枚举,业务代码里直接用JOOQ生成的版本——它已经实现了JOOQ的EnumType接口,能直接和PostgreSQL的枚举类型做映射。
调整业务实体Some的someType字段类型为JOOQ生成的SomeType,插入代码就能正常运行:
@Transactional fun save(some: Some) = dslContext.insertInto(SOME, SOME.TYPE) .values(some.someType) .execute()
办法2:保留自定义枚举,添加转换逻辑
如果必须保留自己的SomeType,可以在插入时手动转换成JOOQ生成的枚举:
先给自定义枚举加个转换方法:
// 注意替换成JOOQ生成枚举的实际包路径 fun SomeType.toJooqEnum(): com.your.project.generated.SomeType { return when(this) { SomeType.Type1 -> com.your.project.generated.SomeType.Type1 SomeType.Type2 -> com.your.project.generated.SomeType.Type2 } }
然后在插入时调用转换:
@Transactional fun save(some: Some) = dslContext.insertInto(SOME, SOME.TYPE) .values(some.someType.toJooqEnum()) .execute()
办法3:配置JOOQ直接映射到自定义枚举
如果想让JOOQ生成代码时直接使用你的自定义枚举,需要调整代码生成配置,添加强制类型映射:
示例Maven配置(Gradle类似)
<configuration> <generator> <database> <forcedTypes> <forcedType> <!-- 你的自定义枚举全类名 --> <userType>com.your.project.SomeType</userType> <!-- 自定义转换器全类名 --> <converter>com.your.project.SomeTypeConverter</converter> <!-- 匹配PostgreSQL的枚举类型 --> <includeTypes>users\.some_type</includeTypes> </forcedType> </forcedTypes> </database> </generator> </configuration>
实现转换器类
写一个Converter子类,负责在自定义枚举和数据库枚举字面量之间转换:
class SomeTypeConverter : Converter<String, SomeType> { override fun from(databaseValue: String?): SomeType? { return databaseValue?.let { SomeType.valueOf(it) } } override fun to(userValue: SomeType?): String? { return userValue?.name } override fun fromType(): Class<String> = String::class.java override fun toType(): Class<SomeType> = SomeType::class.java }
配置完成后重新生成JOOQ代码,SOME.TYPE字段就会直接适配你的自定义枚举,插入时无需额外转换。
内容的提问来源于stack exchange,提问作者razzledazzle88
相关产品推荐
相关产品推荐

