2012-12-04 37 views
0

我在DB2上使用Hibernate。當我使用參數爲枚舉值列表創建NameQuery時,getResultList()會引發非法對流異常。將Hibernate中的Enum List傳遞給namedQuery.setParameter()後發生非法轉換異常

@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() 

的異常當方法被調用:

ERROR: [jcc][1083][10406][4.2.73] Illegal conversion: can not convert from "byte[]" to "java.lang.String" ERRORCODE=-4474, SQLSTATE=null 
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: [jcc][1083][10406][4.2.73] Illegal conversion: can not convert from "byte[]" to "java.lang.String" ERRORCODE=-4474, SQLSTATE=null 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1377) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300) 
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:266) 
    at **hidden**.jpa.main.Deliverable.getDeliverableFiles(Deliverable.java:68) 
    at **hidden**.dbtestbed.DBTestbed.main(DBTestbed.java:165) 
Caused by: org.hibernate.exception.GenericJDBCException: [jcc][1083][10406][4.2.73] Illegal conversion: can not convert from "byte[]" to "java.lang.String" ERRORCODE=-4474, SQLSTATE=null 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) 
    at $Proxy40.setBytes(Unknown Source) 
    at org.hibernate.type.descriptor.sql.VarbinaryTypeDescriptor$1.doBind(VarbinaryTypeDescriptor.java:57) 
    at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:92) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:305) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:300) 
    at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:66) 
    at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:588) 
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1736) 
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1697) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:832) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:293) 
    at org.hibernate.loader.Loader.doList(Loader.java:2382) 
    at org.hibernate.loader.Loader.doList(Loader.java:2368) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2198) 
    at org.hibernate.loader.Loader.list(Loader.java:2193) 
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195) 
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1244) 
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101) 
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:257) 
    ... 2 more 
Caused by: com.ibm.db2.jcc.a.SqlException: [jcc][1083][10406][4.2.73] Illegal conversion: can not convert from "byte[]" to "java.lang.String" ERRORCODE=-4474, SQLSTATE=null 
    at com.ibm.db2.jcc.a.cd.a(cd.java:650) 
    at com.ibm.db2.jcc.a.cd.a(cd.java:60) 
    at com.ibm.db2.jcc.a.cd.a(cd.java:94) 
    at com.ibm.db2.jcc.a.gc.a(gc.java:677) 
    at com.ibm.db2.jcc.a.vl.a(vl.java:1207) 
    at com.ibm.db2.jcc.a.vl.setBytes(vl.java:1174) 
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.setBytes(NewProxyPreparedStatement.java:235) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122) 
    ... 24 more 

任何提示或線索或想法是極大的讚賞。

回答

0

發現了問題 - 這是在NamedQuery一個簡單的拼寫錯誤。 releaseType屬性未通過別名限定d。它應該是:d.releaseType(:releaseTypes)。就像將ArrayList傳遞給setParameter()一樣,一切都是正確的。

0

參數可見性,體系結構和releaseTypes是ArrayList。這不受db2支持。他們必須轉換成正確的列格式。

String whereCondition1 = "'"; 
for(string tmp : visibilities){ 
    whereCondition1 = whereCondition1 + tmp + "','"; 
} 
whereCondition1.subString(0,whereCondition1.length() -1); 

應設置使該ArrayList成這種格式

deliverableFiles.setParameter("visibilities", whereCondition1); 
+0

感謝您的快速回復。我不確定通過轉換爲正確的列格式我明白你的意思。在db2中,這些列是varchar。 JPQL將它們視爲相應的枚舉,所以我無法通過ArrayList 。那麼,我將如何將枚舉值作爲集合傳遞給指定的查詢參數?謝謝。 – Hank

+0

所以條件必須是我在哪裏,所以ArrayLists必須轉換爲'String1','String2','String3'... –

+0

我hardocded:deliverrableFiles.setParameter(「visibilities」,「'INTERNAL'」 ); JPQL不喜歡那樣。它希望將枚舉傳遞給setParameter。我得到這個:java.lang.IllegalArgumentException:參數值['INTERNAL']與預期類型不匹配[** hidden **。jpa.enums.DeliverableVisibility] – Hank

相關問題