2009-07-23 9 views
5

Nella seguente query JPA, i: fcIds nome parametro deve essere un elenco di valori interi:List come un parametro denominato nella query JPA utilizzando TopLink

@NamedQuery(name = "SortTypeNWD.findByFcIds", query = "SELECT s FROM SortTypeNWD s WHERE s.sortTypeNWDPK.fcId IN (:fcIds)") 

Logicamente, questo è ciò che viene fatto quando la La query denominata è denominata:

Query findByDatesPlFcIds = em.createNamedQuery("SortTypeNWD.findByFcIds"); 
findByDatesPlFcIds.setParameter("fcIds", fcIds); 

Dove la variabile fcIds è un oggetto ArrayList contenente numeri interi.

Tutto il codice qui sopra funziona bene con Hibernate, ma non lo fa con TopLink:

Caused by: java.lang.IllegalArgumentException: You have attempted to set a value of type class java.util.ArrayList for parameter fcIds with expected type of int from query string SELECT s FROM SortTypeNWD s WHERE s.sortTypeNWDPK.fcId IN (:fcIds). 

Esiste una soluzione per utilizzare una lista come parametro denominato in TopLink? Il tipo del parametro denominato può essere forzato?

risposta

0

Ho riscontrato un simile requisito e sono riuscito quando ho cambiato query.setParameter ("fcIds", fcIds) in setParameterList ("fcIds", fcIds). L'unica differenza era che avevo bisogno di apportare questa modifica durante l'utilizzo di Hibernate (non sto usando TopLink), rispetto al caso in cui si presuppone che setParamter() sembra funzionare con Hibernate.

4

Toplink implementa JPA 1.0 che non supporta il passaggio di un elenco come parametro (collection_valued_input_parameter è il termine utilizzato nella documentazione). Questo è supportato in JPA 2.0, implementato nel successore di TopLink, EclipseLink.

Se è necessario attenersi a TopLink, è necessario scrivere un ciclo per includere ciascun elemento nell'elenco come parametro.

+1

Chi ha idea chiara di includere questo in Query denominate e non in NativeNamedQueries? Stavo cercando per due ore cercando di capire perché la mia query non avrebbe funzionato. – SoftwareSavant

Problemi correlati