我试图将枚举列表传递到我的休眠查询中。这是我想做的事情:

public Integer getReportRunsCount(Set<ReportRunStatus> statusSet, Optional<String> userId) {
    Query query = sessionFactory.getCurrentSession().createQuery("select count(1) from ReportRun r where r.status in (:fieldStatuses) and r.createdBy = :userId");
    query.setParameterList("fieldStatuses", Arrays.asList(statusSet));
    query.setString("userId", userId.orElse(null));
    return Ints.checkedCast((Long)query.uniqueResult());
}


ReportRunStatus.java:

public enum ReportRunStatus {
    STARTED,
    QUERYDATA,
    PROCESSINGDATA,
    COMPLETED,
    CANCELLED,
    ERROR;
}


我只是想将这些fieldStatuses作为参数传递,其中ReportRunStatus是枚举类。但是,我不断收到这个错误,说

java.lang.ClassCastException: java.util.HashSet cannot be cast to java.lang.Enum

任何想法为什么会发生这种情况?我在这里查看了此链接:using enum list as parameter in HQL query作为执行我要尝试执行的操作的参考,但我不断收到上述错误。任何帮助,将不胜感激。谢谢!

最佳答案

造成此问题的原因是:Arrays.asList(statusSet)

这只是创建一个以Set作为值的单元素列表(即List<Set<ReportRunStatus>>。但是setParameterList期望的是Collection<ReportRunStatus>,因此导致类强制转换异常,因为在内部它正在取出一个元素(这是HashSet<ReportRunStatus>),并尝试将其强制转换为ReportRunStatus

你应该做的是

query.setParameterList("fieldStatuses", statusSet);

10-01 13:30