2009-07-23 21 views
5

w następującej kwerendzie WZP, że: fcIds nazwany parametr musi być listą wartości:Lista jako nazwany parametr w WZP kwerendy przy użyciu TopLink

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

Całkiem logicznie, to co dzieje się, gdy nazwane zapytanie nazywa się:

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

Gdzie zmienna fcIds jest liczbą całkowitą ArrayList.

Wszystkie wyżej kod działa poprawnie z Hibernate, ale nie robi z 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). 

Czy istnieje obejście użyć listy jako parametru nazwanego w TopLink? Czy można wymusić typ określonego parametru?

Odpowiedz

0

Napotkałem podobne wymaganie i odniosłem sukces, gdy zmieniłem query.setParameter ("fcIds", fcIds) na setParameterList ("fcIds", fcIds). Jedyną różnicą było to, że musiałem wprowadzić tę zmianę podczas używania Hibernate (nie używam TopLink), w porównaniu do twojego przypadku, w którym sugerujesz, że setParamter() wydawał się pracować z Hibernate.

4

Toplink implementuje JPA 1.0, który nie obsługuje przekazywania listy jako parametru (collection_valued_input_parameter jest terminem używanym w dokumentacji). Jest to obsługiwane w JPA 2.0, który jest implementowany w następcy TopLink, EclipseLink.

Jeśli musisz trzymać się TopLink, musisz napisać pętlę, aby uwzględnić każdy element na liście jako parametr.

+1

Kto jest świetnym pomysłem, aby włączyć to do nazwanych zapytań, a nie NativeNamedQueries? Szukałem dwóch godzin, próbując zrozumieć, dlaczego moje zapytanie nie zadziałało. – SoftwareSavant

Powiązane problemy