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
)
我们有一个带有自定义值的枚举 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/ 正是我所需要的。
您当然可以从头开始实现自定义转换器,就像您 org.jooq.impl.EnumConverter
来简化该实现:
class RoleConverter : EnumConverter<Int, Role>(
Int::class.java,
Role::class.java,
Role::value
)