【问题标题】:Create search specification for Entity with Enum column为具有枚举列的实体创建搜索规范
【发布时间】: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


【解决方案1】:

你没有显示params.getStatus() 是什么,所以很难帮助你。从异常的意思来看,这会返回一个不是枚举类型 OnboardingTaskStatus 的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-13
    • 1970-01-01
    • 2015-08-07
    • 2012-08-21
    • 2021-06-05
    • 1970-01-01
    • 2020-06-10
    相关资源
    最近更新 更多