Создайте спецификацию поиска для сущности со столбцом перечисления

#java #hibernate #jpa #enums #spring-data-jpa

Вопрос:

У меня есть эта сущность со столбцом перечисления:

 @Enumerated(EnumType.STRING)
@Column(name = "status", length = 20)
private OnboardingTaskStatus status;
 

Где объявление перечисления выглядит так:

 public enum OnboardingTaskStatus {
    NEW,
    IN_PROGRESS,
    DISABLED;
}
 

Я попытался реализовать спецификацию поиска:

 Specification<OnboardingTasks> spec = (root, query, cb) -> {
    List<Predicate> predicates = new ArrayList<>();
    if (params.getTitle() != null) {
        predicates.add(cb.like(cb.lower(root.get("title")), "%"   params.getTitle().toLowerCase()   "%"));
    }
    if (params.getStatus() != null) {
        predicates.add(cb.equal(root.get("status"), params.getStatus()));
    }
    return cb.and(predicates.toArray(new Predicate[predicates.size()]));
};
return onboardingTasksService
         .findAll(spec, pageable)
         .map(onboardingMapper::taskToTaskDTO);
 

Я получаю сообщение об ошибке:

OnboardingTaskStatus.2769df0841; вложенное исключение-java.lang.Исключение IllegalArgumentException: Нет константы перечисления на борту. 2769df0841] с основной причиной java.lang.Исключение IllegalArgumentException: Нет константы перечисления на борту. 2769df0841

Должен ли я использовать такой конвертер, как

@Convert(converter = OnboardingTaskStatus.class)

как описано здесь: Сопоставление перечислений Выполнено правильно с помощью @Convert в JPA 2.1

Есть ли лучший способ реализовать это?

Комментарии:

1. Является params.getStatus() ли тип значения OnboardingTaskStatus ? Или это то самое String ?

2. Это строковое значение.

3. Тогда в этом-то и проблема. Типы не совпадают. Вы должны использовать OnboardingTaskStatus . Hibernate выполняет преобразование внутри

4. Если это строка, то в сообщении об ошибке будет указано строковое значение, например, java.lang.IllegalArgumentException: Parameter value [NEW] did not match expected type [OnboardingTaskStatus (n/a)] Может быть, существует не только перечисление OnboardingTaskStatus , но и класс с тем же именем?

5. Можете ли вы попробовать использовать params.getStatus().name() вместо этого ?

Ответ №1:

Вы не показываете, что params.getStatus() есть, поэтому вам довольно трудно помочь. Из того, что говорит исключение, приходит на ум, что это возвращает объект, который не относится к типу перечисления OnboardingTaskStatus .