我正在尝试将枚举列表传入我的hibernate查询。这是我想要做的:
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作为参考来做我想做的事情,但我一直得到上面的错误。任何帮助,将不胜感激。谢谢!
答案 0 :(得分:3)
导致问题的原因是:Arrays.asList(statusSet)
这只是创建一个单元素列表,其中Set
为值(即List<Set<ReportRunStatus>>
。但setParameterList
期待Collection<ReportRunStatus>
,因此导致class cast异常,因为在内部它正在获取一个元素(这是一个HashSet<ReportRunStatus>
)并试图将它转换为ReportRunStatus
。
你应该做的是像
query.setParameterList("fieldStatuses", statusSet);
答案 1 :(得分:-1)
试试这个,
List<String> reportRunStatusList = new ArrayList<String>();
for(ReportRunStatus reportRunStatus : statusSet){
reportRunStatusList.add(reportRunStatus.toString);
}
query.setParameterList("fieldStatuses", reportRunStatusList);
您只需要明确地将枚举转换为String。