跳到主要内容

Enum映射

Jimmer处理枚举有两种方式:

  • 映射为字符串:可观察性优先的选择,也是默认的选项。

  • 映射为整数:性能优先的选择。

Jimmer提供了两个用于枚举的注解

  • org.babyfish.jimmer.sql.EnumType: 修饰枚举类型,可选

    指定映射方式,映射为字符串,还是按位置映射为整数

  • org.babyfish.jimmer.sql.EnumItem: 修饰枚举项,可选

    覆盖某个枚举项被映射后的字符串值或整数值

映射为字符串

Gender.java
@EnumType(EnumType.Strategy.NAME)
public enum Gender {
MALE,
FEMALE
}

这里,@EnumType的参数被指定为"NAME", 表示映射为字符串。默认情况下,两个枚举项映射后的字符串和它们的名字相同,即"MALE"和"FEMALE"。

如果你期望后的字符串和枚举项名称不同,你可以使用@EnumItem修饰枚举项。

Gender.java
@EnumType(EnumType.Strategy.NAME)
public enum Gender {

@EnumItem(name = "M")
MALE,

@EnumItem(name = "F")
FEMALE
}

映射为整数

Gender.java
@EnumType(EnumType.Strategy.ORDINAL)
public enum Gender {
MALE,
FEMALE
}

这里,@EnumType的参数被指定为"ORDINAL", 表示映射为整数。默认情况下,两个枚举项映射后的字符串和它们的ordinal相同,即0和1。

如果你期望后的字符串和枚举项的ordinal不同,你可以使用@EnumItem修饰枚举项。

Gender.java
@EnumType(EnumType.Strategy.ORDINAL)
public enum Gender {

@EnumItem(ordinal = 100)
MALE,

@EnumItem(ordinal = 200)
FEMALE
}

不明确使用@EnumType

你也可以不为枚举类型指定@EnumType注解,即,不明确说明某个枚举类型应该映射成字符串还是整数。

此时,Jimmer会参考默认的全部配置。

信息

此全局配置默认为"NAME",如果你需要"ORDINAL",请覆盖全部配置。

接下来,我们展示如何覆盖全部配置。

  • 使用SpringBoot时

    application.ymlapplication.properties种添加配置项jimmer.default-enum-strategy,将其指定为"ORDINAL"

  • 不使用SpringBoot时

    JSqlClient sqlClient = JSqlClient
    .newBuilder()
    .setDefaultEnumStrategy(EnumType.Strategy.ORDINAL)
    ...省略其他配置...
    .build();

与 Typescript Client and Jackson一起使用

一个类型的Json序列化与数据库中的存储是独立的两件事。上述所描述的内容只是Jimmer在数据库中如何处理枚举映射,与Json无关。

在默认情况下,Jackson将枚举转换为枚举名字符串,所以Jimmer会在生成TypeScript Client的时候按照枚举的Name映射

enum 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注解

enum Gender {
MAN,
WOMAN;

@JsonValue
public String getValue() {
return name().toLowerCase();
}
}

在检测到存在@JsonValue等注解后,因为jimmer不知道在Json序列化时,枚举会被转换为什么,所以Jimmer会把枚举类型翻译成string,生成的TypeScript代码如下:

export type PersonDto = {
gender: string;
}