我有一个 Spring Boot 应用程序,并且定义了一些 POJO 类来指定数据模型。在表中,我想存储枚举列,但我有枚举数据类型,并且某些枚举包含空格。
enum DataEnum {
Workload("Workload"),
ReleaseContent("Release content"),
"VerificationProc"("Verification proc")
private String name = "";
DataEnum (final String name) {
this.name = name;
}
public String getName() {
return name;
}
public DataEnum fromString(String value) {
return DataEnum.valueOf(value);
}
@Override
public String toString() {
return name;
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个 POJO 实体类,如下所示:
@Entity
@IdClass(FieldId.class)
public class Field {
@Id
private String id;
@Id
@Enumerated(EnumType.STRING)
private DataEnum sheet;
...
}
Run Code Online (Sandbox Code Playgroud)
当我尝试从数据库检索数据时,我得到:
java.lang.IllegalArgumentException:枚举类 [data.util.DataEnum] 的未知名称值 [发布内容]
JPA 无法将您的字符串映射到枚举,因为它找不到任何具有该名称的枚举。
在内部,@Enumerated 使用该方法Enum.valueOf将 DB String 转换为枚举常量。DB String 需要与枚举常量标识符完全相同。
也就是说,如果要存储DataEnum.ReleaseContent,就必须将其存储为ReleaseContent不存储Release content。
在您的情况下,如果您想存储与枚举标识符不同的值,您可以声明一个自定义转换器:
@Converter
public class DataEnumConverter implements AttributeConverter<DataEnum, String> {
@Override
public String convertToDatabaseColumn(DataEnum enum) {
// Convert your enum to DB value
}
@Override
public DataEnum convertToEntityAttribute(String dbValue) {
// Convert String to your enum
}
}
Run Code Online (Sandbox Code Playgroud)
您可以查看我的答案,了解如何将字符串转换为枚举的示例
在您的实体中:
@Column
@Convert(converter = DataEnumConverter.class)
private DataEnum sheet;
Run Code Online (Sandbox Code Playgroud)