JPA 检索带有空格的枚举

geo*_*a_e 1 java enums jpa

我有一个 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] 的未知名称值 [发布内容]

Mạn*_*yễn 5

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)