2009-07-23 18 views
5

En la siguiente consulta de la APP, los: fcIds nombre del parámetro debe ser una lista de valores enteros:de lista como un parámetro llamado en consulta JPA utilizando TopLink

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

Como es lógico, esto es lo que se hace cuando el consulta con nombre se llama:

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

Donde las variables fcIds es un ArrayList que contiene números enteros.

Todo el código anterior funciona bien con Hibernate, pero no lo hace 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). 

¿Hay una solución para utilizar una lista como un parámetro denominado en TopLink? ¿Se puede forzar el tipo del parámetro nombrado?

Respuesta

0

Encontré un requisito similar, y tuve éxito cuando cambié query.setParameter ("fcIds", fcIds) para setParameterList ("fcIds", fcIds). La única diferencia era que necesitaba hacer este cambio mientras usaba Hibernate (no estoy usando TopLink), frente a su caso donde implica que setParamter() parecía estar trabajando con Hibernate.

4

Toplink implementa JPA 1.0 que no admite pasar una lista como parámetro (collection_valued_input_parameter es el término utilizado en la documentación). Esto es compatible con JPA 2.0 que se implementa en el sucesor de TopLink, EclipseLink.

Si tiene que seguir con TopLink, debe escribir un bucle para incluir cada elemento de la lista como parámetro.

+1

¿Quién tiene la brillante idea de incluir esto en Consultas con nombre y no en NativeNamedQueries? Estuve buscando durante dos horas tratando de descubrir por qué mi consulta no funcionaría. – SoftwareSavant

Cuestiones relacionadas