Jooq 枚举转换器使用序号。如何切换为使用枚举值编号?

Jooq enum converter uses the ordinal number. How can I switch to use the enum value number instead?

我们有一个带有自定义值的枚举 class。出于商业目的,这些值与它们的序数不同,我无法更改。

enum class Role(val value: Int) {
  EXECUTOR(1),
  MONITOR(3),
  ADMIN(5),

  companion object {
    private val map = Role.values().associateBy(Role::value)
    fun fromInt(role: Int) = map[role]
  }
}

我们正在使用 JOOQ 和 postgres。我们使用 JOOQ 默认值 EnumConverter 将数据库角色整数值转换为对象。

ForcedType()
    .withUserType("com.company.enums.Role")
    .withEnumConverter(true)
    .withIncludeExpression("role"),

但是我们注意到了一个问题——数据库存储了枚举的序数,而不是值。例如我们在 db in roles 列中看到,db 值为 1,翻译后的 Enum 为 MONITOR,因为 MONITOR 的序数为 1.

我们如何使用 JOOQ 将枚举的值存储到数据库中?

谢谢!

哦,我明白了!自定义转换器 https://www.jooq.org/doc/latest/manual/code-generation/custom-data-types/ 正是我所需要的。

您当然可以从头开始实现自定义转换器,就像您 . But do note that starting from jOOQ 3.16 and https://github.com/jOOQ/jOOQ/issues/12423 一样,您可以通过像这样扩展 org.jooq.impl.EnumConverter 来简化该实现:

class RoleConverter : EnumConverter<Int, Role>(
  Int::class.java, 
  Role::class.java, 
  Role::value
)