【问题标题】:JPA retrieve enum with white spaceJPA 检索带有空格的枚举
【发布时间】:2018-05-11 06:35:16
【问题描述】:

我有一个 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;
    }
} 

我有一个 POJO 实体类如下:

@Entity
@IdClass(FieldId.class)
public class Field {
    @Id
    private String id;

    @Id
    @Enumerated(EnumType.STRING)
    private DataEnum sheet;

    ...
}

当我尝试从数据库中检索数据时,我得到:

java.lang.IllegalArgumentException: 未知名称值 [发布 枚举类[data.util.DataEnum]的内容]

【问题讨论】:

  • 什么是“包含空间的枚举”。显示代码
  • 那么,您试图通过名称值而不是枚举的字符串值(即;ReleaseContent)来获取枚举?
  • 不要使用 toString() 来显示名称。做一个 getName() 方法什么的。
  • @VeselinDavidov 为什么会这样? java.lang.Enum 的 Javadoc 声明“当存在更“程序员友好”的字符串形式时,枚举类型应覆盖此方法。”。您不能依赖枚举上的 toString() 来返回常量名称 - 为此,有一个最终方法 Enum.name()
  • 嗯,它可以是调用 getName() 而不是 name() 的 ORM 吗?

标签: java jpa enums


【解决方案1】:

JPA 无法将您的字符串映射到枚举,因为它找不到任何具有该名称的枚举存在。

在内部,@Enumerated 使用 Enum.valueOf 方法将 DB 字符串转换为枚举常量。 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
    }
}

您可以查看My Answer 了解如何将字符串转换为枚举的示例

在你的实体中:

@Column
@Convert(converter = DataEnumConverter.class)
private DataEnum sheet;

【讨论】:

  • 或者只是将枚举常量而不是它们的名称存储在数据库中;)您甚至不确定名称是唯一的并且常量是唯一的。
  • 你看到OP当前的数据结构:ReleaseContent("Release content"),了吗?友好名称与枚举标识符不匹配。很多时候,您希望保存一个不同于枚举标识符的名称。为枚举提供如此独特的名称是程序员的工作
  • 我看到了数据结构,如果他使用 @Enumerated(EnumType.STRING) ,那么进入数据库的值将是 ReleaseContent -> 枚举常量。问题来了,因为在数据库中他有另一个值“发布内容”
  • 我尝试了转换器方法,但我得到:无法写入 JSON 文档:无法从 ResultSet 读取实体状态:.. 嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException:无法读取ResultSet 中的实体状态
  • 为什么还是和 JSON 有关?你在做什么?尝试将实体返回到浏览器?把完整的堆栈跟踪发给我
猜你喜欢
  • 1970-01-01
  • 2012-01-13
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
相关资源
最近更新 更多