JPA 查询:java.lang.ClassCastException:[Enum] 无法转换为 java.lang.Enum

dru*_*uiz 3 java enums hibernate jpa

我需要一些帮助...

我实际上正在构建一个应用程序并使用 JPA 进行查询,但枚举类型有问题。

我有这个。

public enum SchedulingStatus {

SKIPPED, PENDING_CONFIRMATION, CONFIRMED, SENT, PROCESSING, CANCELLED, FINISHED, FINISHED_WITH_ERRORS, NOT_CONFIRMED_IN_SERVER

}
Run Code Online (Sandbox Code Playgroud)

然后是 FarmIrrigationScheduling.java 类,其中包含许多其他字段以及重要的字段:

@Column
@Enumerated(EnumType.ORDINAL)
private SchedulingStatus status;
Run Code Online (Sandbox Code Playgroud)

然后尝试执行此查询:

TypedQuery<FarmIrrigationScheduling> query = getEntityManager().createQuery(
            "from FarmIrrigationScheduling where farm = :farm AND status not in :statusCollection ORDER BY calculated DESC",
            FarmIrrigationScheduling.class);
    query.setParameter("farm", farm);

    SchedulingStatus[] status = new SchedulingStatus[] { SchedulingStatus.FINISHED,
            SchedulingStatus.FINISHED_WITH_ERRORS, SchedulingStatus.CANCELLED };
    query.setParameter("statusCollection", status);

    return getSingleResult(query);
Run Code Online (Sandbox Code Playgroud)

我收到以下异常:

Caused by: java.lang.ClassCastException: [Lau.com.agrichem.addams.server.model.enums.SchedulingStatus; cannot be cast to java.lang.Enum
at org.hibernate.type.EnumType.nullSafeSet(EnumType.java:239)
at org.hibernate.type.CustomType.nullSafeSet(CustomType.java:170)
at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:53)
at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:628)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1956)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1909)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1887)
at org.hibernate.loader.Loader.doQuery(Loader.java:932)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349)
at org.hibernate.loader.Loader.doList(Loader.java:2615)
at org.hibernate.loader.Loader.doList(Loader.java:2598)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2430)
at org.hibernate.loader.Loader.list(Loader.java:2425)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1458)
at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1426)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1398)
at org.hibernate.Query.getResultList(Query.java:417)
at au.com.agrichem.addams.server.model.repositories.base.HibernateDaoImpl.getSingleResult(HibernateDaoImpl.java:100)
at au.com.agrichem.addams.server.model.repositories.impl.SchedulingsDaoImpl.getCurrentSchedulingByFarm(SchedulingsDaoImpl.java:126)
at au.com.agrichem.addams.server.services.impl.SchedulingsServiceImpl.getScheduling(SchedulingsServiceImpl.java:68)
... 116 more
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它不能将 Enum 强制转换为实际上的 java.lang.Enum。在我使用 Hibernate 和 HQL 来实现此目的并且我正在工作之前,现在我进行了更改,我遇到了这个问题。

有谁知道为什么以及如何解决它?

预先非常感谢!

Boh*_*ian 5

这与枚举无关。

您必须传入一个列表,而不是一个数组:

// Create a List:
List<SchedulingStatus> statuses = Arrays.asList(SchedulingStatus.FINISHED,
        SchedulingStatus.FINISHED_WITH_ERRORS, SchedulingStatus.CANCELLED);

query.setParameter("statusCollection", statuses);
Run Code Online (Sandbox Code Playgroud)