1

我们有一个具有自定义值的 Enum 类。出于商业目的,这些值与它们的序数不同,我无法改变。

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将 db 角色整数值转换为对象。

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

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

我们如何使用 JOOQ 将 Enum 的值存储到 db 中?

谢谢!

4

2 回答 2

1

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

于 2022-02-10T13:58:18.110 回答
1

正如您在自己的答案中建议的那样,您当然可以从头开始实现自定义转换器。但请注意,从 jOOQ 3.16 和https://github.com/jOOQ/jOOQ/issues/12423开始,您可以通过扩展如下来简化该实现org.jooq.impl.EnumConverter

class RoleConverter : EnumConverter<Int, Role>(
  Int::class.java, 
  Role::class.java, 
  Role::value
)
于 2022-02-10T15:56:49.297 回答