Java 将枚举列表传递给Hibernate中的namedQuery.setParameter()后出现非法转换异常

Java 将枚举列表传递给Hibernate中的namedQuery.setParameter()后出现非法转换异常,java,hibernate,db2,named-query,Java,Hibernate,Db2,Named Query,我正在DB2上使用Hibernate。当我创建一个参数为枚举值列表的NameQuery时,getResultList()抛出非法转换异常 @NamedQuery( name="Deliverable.deliverableFiles", query="Select distinct f " + "from Deliverable d JOIN d.deliverableFiles f JOIN f.architectures a "

我正在DB2上使用Hibernate。当我创建一个参数为枚举值列表的NameQuery时,getResultList()抛出非法转换异常

@NamedQuery(
        name="Deliverable.deliverableFiles",
        query="Select distinct f " +
                "from Deliverable d JOIN d.deliverableFiles f JOIN f.architectures a " +
                "where d.visibility in (:visibilities) and a.architecture in (:architectures) " +
                "and d.hidden = false and releaseType in (:releaseTypes) "
)
Java方法:

public static List<DeliverableFile> getDeliverableFiles(EntityManager em, ArrayList<DeliverableVisibility> visibilities,
                                                 ArrayList<DeliverableArchitectureType> architectures,
                                                 ArrayList<DeliverableReleaseType> releaseTypes, int limit) {
    Query deliverableFiles = em.createNamedQuery("Deliverable.deliverableFiles");
    deliverableFiles.setFlushMode(FlushModeType.COMMIT);
    deliverableFiles.setParameter("visibilities", visibilities);
    deliverableFiles.setParameter("architectures", architectures);
    deliverableFiles.setParameter("releaseTypes", releaseTypes);

    List<DeliverableFile> files;

    try {
        files = deliverableFiles.getResultList();   // exceptions is thrown here
    } // end try
    catch (NoResultException nre) {
        files = null;
    } // end catch

    return files;
} // end getDeliveries()

非常感谢任何提示、线索或想法。

参数可见性、架构和发布类型为ArrayList。db2不支持这一点。它们必须转换为正确的列格式

String whereCondition1 = "'";
for(string tmp : visibilities){
    whereCondition1 = whereCondition1 + tmp + "','";
}
whereCondition1.subString(0,whereCondition1.length() -1);
您应该将arraylist设置为这种格式

deliverableFiles.setParameter("visibilities", whereCondition1);

发现问题-这是NamedQuery中的一个简单输入错误。别名d未限定releaseType属性。它应该是:d.releaseType in(:releaseTypes)。其他所有操作都是正确的,将枚举对象作为ArrayList传递给setParameter()。

感谢您的快速响应。我不确定我是否理解您转换为正确列格式的意思。在db2中,这些列是varchar。JPQL将它们视为对应的枚举,因此无法传递ArrayList。那么,如何将枚举值作为集合传递给命名查询参数呢?谢谢。所以条件必须是iin,其中in,所以ArrayList必须转换为'String1'、'String2'、'String3'…I hardocted:deliverableFiles.setParameter(“Visibility”、'INTERNAL');JPQL不喜欢这样。它希望将枚举传递给setParameter。我发现:java.lang.IllegalArgumentException:参数值['INTERNAL']与预期类型[hidden.jpa.enums.DeliverableVibility]不匹配,这与我在setParameter()调用中硬编码'INTERNAL'时的情况基本相同,但我也尝试了您的示例。不幸的是,它导致java.lang.IllegalArgumentException:参数值['INTERNAL'、'CUSTOMER'、'CUSTOMERDEVELOPER']与预期类型[/hidden/.jpa.enums.DeliverableVibility]不匹配。这些属性被注释为预期枚举,因此我无法向它们传递字符串。我的下一个选择是使用QueryBuilder,但我希望避免使用它。
deliverableFiles.setParameter("visibilities", whereCondition1);