【发布时间】:2021-09-13 16:09:42
【问题描述】:
我有这个带有枚举列的实体:
@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: No enum constant OnboardingTaskStatus.2769df0841] 根本原因 java.lang.IllegalArgumentException: No enum constant OnboardingTaskStatus.2769df0841
我应该使用像这样的转换器
@Convert(converter = OnboardingTaskStatus.class)
如此处所述:Mapping Enums Done Right With @Convert in JPA 2.1
有没有更好的方法来实现这一点?
【问题讨论】:
-
params.getStatus()的值类型是OnboardingTaskStatus吗?还是String? -
这是一个字符串值。
-
那就是问题所在。类型不匹配。您应该使用
OnboardingTaskStatus。 Hibernate 在内部进行转换 -
如果它是一个字符串,那么错误消息会提到这样的字符串值
java.lang.IllegalArgumentException: Parameter value [NEW] did not match expected type [OnboardingTaskStatus (n/a)]可能不仅有枚举OnboardingTaskStatus,而且还有一个同名的类? -
您可以尝试使用
params.getStatus().name()代替吗?
标签: java hibernate jpa enums spring-data-jpa