#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
.