Enum映射
Jimmer处理枚举有两种方式:
-
映射为字符串:可观察性优先的选择,也是默认的选项。
-
映射为整数:性能优先的选择。
Jimmer提供了两个用于枚举的注解
-
org.babyfish.jimmer.sql.EnumType
: 修饰枚举类型,可选指定映射方式,映射为字符串,还是按位置映射为整数
-
org.babyfish.jimmer.sql.EnumItem
: 修饰枚举项,可选覆盖某个枚举项被映射后的字符串值或整数值
映射为字符串
- Java
- Kotlin
@EnumType(EnumType.Strategy.NAME)
public enum Gender {
MALE,
FEMALE
}
@EnumType(EnumType.Strategy.NAME)
enum class Gender {
MALE,
FEMALE
}
这里,@EnumType
的参数被指定为"NAME", 表示映射为字符串。默认情况下,两个枚举项映射后的字符串和它们的名字相同,即"MALE"和"FEMALE"。
如果你期望后的字符串和枚举项名称不同,你可以使用@EnumItem
修饰枚举项。
- Java
- Kotlin
@EnumType(EnumType.Strategy.NAME)
public enum Gender {
@EnumItem(name = "M")
MALE,
@EnumItem(name = "F")
FEMALE
}
@EnumType(EnumType.Strategy.NAME)
enum class Gender {
@EnumItem(name = "M")
MALE,
@EnumItem(name = "F")
FEMALE
}
映射为整数
- Java
- Kotlin
@EnumType(EnumType.Strategy.ORDINAL)
public enum Gender {
MALE,
FEMALE
}
@EnumType(EnumType.Strategy.ORDINAL)
enum class Gender {
MALE,
FEMALE
}
这里,@EnumType
的参数被指定为"ORDINAL", 表示映射为整数。默认情况下,两个枚举项映射后的字符串和它们的ordinal
相同,即0和1。
如果你期望后的字符串和枚举项的ordinal
不同,你可以使用@EnumItem
修饰枚举项。
- Java
- Kotlin
@EnumType(EnumType.Strategy.ORDINAL)
public enum Gender {
@EnumItem(ordinal = 100)
MALE,
@EnumItem(ordinal = 200)
FEMALE
}
@EnumType(EnumType.Strategy.ORDINAL)
enum class Gender {
@EnumItem(ordinal = 100)
MALE,
@EnumItem(ordinal = 200)
FEMALE
}
不明确使用@EnumType
你也可以不为枚举类型指定@EnumType注解,即,不明确说明某个枚举类型应该映射成字符串还是整数。
此时,Jimmer会参考默认的全部配置。
此全局配置默认为"NAME",如果你需要"ORDINAL",请覆盖全部配置。
接下来,我们展示如何覆盖全部配置。
-
使用SpringBoot时
在
application.yml
或application.properties
种添加配置项jimmer.default-enum-strategy
,将其指定为"ORDINAL" -
不使用SpringBoot时
- Java
- Kotlin
JSqlClient sqlClient = JSqlClient
.newBuilder()
.setDefaultEnumStrategy(EnumType.Strategy.ORDINAL)
...省略其他配置...
.build();val sqlClient = newKSqlClient {
setDefaultEnumStrategy(EnumType.Strategy.ORDINAL)
...省略其他配置...
}
与 Typescript Client and Jackson一起使用
一个类型的Json序列化与数据库中的存储是独立的两件事。上述所描述的内容只是Jimmer在数据库中如何处理枚举映射,与Json无关。
在默认情况下,Jackson将枚举转换为枚举名字符串,所以Jimmer会在生成TypeScript Client的时候按照枚举的Name映射
- Java
- Kotlin
enum Gender {
MAN,
WOMAN
}
enum class Gender {
MAN,
WOMAN
}
生成的TypeScript代码如下:
export const GenderEnum_CONSTANTS = [
'MAN',
'WOMAN'
] as const;
export type GenderEnum = typeof GenderEnum_CONSTANTS[number];
//使用
export type PersonDto = {
gender: GenderEnum;
}
如果想要自定义Json序列化,需要使用Jackson的@JsonValue注解
- Java
- Kotlin
enum Gender {
MAN,
WOMAN;
@JsonValue
public String getValue() {
return name().toLowerCase();
}
}
enum class Gender {
MAN,
WOMAN;
@JsonValue
fun getValue(): String {
return name().toLowerCase();
}
}
在检测到存在@JsonValue等注解后,因为jimmer不知道在Json序列化时,枚举会被转换为什么,所以Jimmer会把枚举类型翻译成string,生成的TypeScript代码如下:
export type PersonDto = {
gender: string;
}