我试图将枚举列表传递到我的休眠查询中。这是我想做的事情:
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);