JPA получить перечисление с пробелом - PullRequest
0 голосов
/ 11 мая 2018

У меня есть приложение с загрузочной пружиной, и я определил несколько классов 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: Неизвестное значение имени [Release content] для перечислимого класса [data.util.DataEnum]

1 Ответ

0 голосов
/ 11 мая 2018

JPA не может сопоставить вашу строку с enum, поскольку он не может найти никакого перечисления с таким именем.

Внутри @Enumerated используется метод Enum.valueOf для преобразования строки БД в константу перечисления. Строка DB должна точно соответствовать идентификатору константы перечисления.

То есть, если вы хотите сохранить DataEnum.ReleaseContent, вы должны сохранить его как ReleaseContent, а не Release content.

В вашем случае, если вы хотите сохранить значение, отличное от идентификатора enum, вы можете объявить пользовательский конвертер:

@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
    }
}

Вы можете увидеть Мой ответ для примера, как преобразовать String в enum

А в вашей сущности:

@Column
@Convert(converter = DataEnumConverter.class)
private DataEnum sheet;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...