2016-10-12 3 views
0

Ich versuche, eine Liste von Enums in meine Hibernate-Abfrage zu übergeben. Hier ist, was ich versuche zu tun:Kann die Liste der Enums nicht in Hibernate Query übergeben?

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; 
} 

ich gerade versucht, in diesen fieldStatuses als Parameter zu übergeben, wo ReportRunStatus ist eine Klasse von Aufzählungen. Aber ich bekomme immer wieder diese Fehlermeldung, dass

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

Irgendwelche Ideen, warum dies passieren könnte? Ich sah diesen Link hier: using enum list as parameter in HQL query als Referenz zu tun, was ich versuche zu tun, aber ich bekomme den Fehler oben. Jede Hilfe wäre willkommen. Vielen Dank!

Antwort

-1

die Sie interessieren,

List<String> reportRunStatusList = new ArrayList<String>(); 
for(ReportRunStatus reportRunStatus : statusSet){ 
    reportRunStatusList.add(reportRunStatus.toString); 
} 
query.setParameterList("fieldStatuses", reportRunStatusList); 

Sie brauchte nur die Aufzählungen in String explizit zu konvertieren.

+0

Nein, Sie müssen es nicht in String konvertieren, vorausgesetzt, das Mapping ist korrekt für eine Enumeration –

3

Was Problem verursacht ist diese: Arrays.asList(statusSet)

Dies ist einfach eine einelementige Liste erstellen, mit einem Set als Wert (dh ein List<Set<ReportRunStatus>> Allerdings ist setParameterList eine Collection<ReportRunStatus> erwarten, daher verursacht es Klasse gegossen. Ausnahme, weil es intern wurde ein Element raus (was ein HashSet<ReportRunStatus> ist) und versucht, es zu einem ReportRunStatus zu werfen.

Was sollten Sie tun, ist so etwas wie

query.setParameterList("fieldStatuses", statusSet); 
Verwandte Themen