2009-07-23 15 views
5

Trong truy vấn JPA sau,: fcIds tên tham số cần phải được một danh sách các giá trị số nguyên:Danh sách như một tham số có tên trong JPA truy vấn sử dụng TopLink

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

Khá hợp lý, đây là những gì được thực hiện khi truy vấn được đặt tên được gọi là:

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

Trường hợp biến fcIds là một ArrayList chứa số nguyên.

Tất cả các mã trên hoạt động tốt với Hibernate nhưng không với 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). 

Có một cách giải quyết để sử dụng một danh sách như một tham số có tên trong TopLink? Loại tham số được đặt tên có thể bị ép buộc không?

Trả lời

0

Tôi đã gặp phải một yêu cầu tương tự và đã thành công khi tôi thay đổi query.setParameter ("fcIds", fcIds) thành setParameterList ("fcIds", fcIds). Sự khác biệt duy nhất là tôi cần phải thực hiện thay đổi này khi sử dụng Hibernate (Tôi không sử dụng TopLink), so với trường hợp của bạn, nơi bạn ngụ ý setParamter() dường như đang làm việc với Hibernate.

4

TopLink triển khai JPA 1.0 không hỗ trợ chuyển danh sách dưới dạng tham số (collection_valued_input_parameter là thuật ngữ được sử dụng trong tài liệu). Điều này được hỗ trợ trong JPA 2.0 được thực hiện trong người kế thừa của TopLink, EclipseLink.

Nếu bạn phải gắn bó với TopLink thì bạn cần phải viết một vòng lặp để bao gồm từng mục trong danh sách dưới dạng tham số.

+1

Ý tưởng sáng suốt của ai là đưa nó vào các truy vấn được đặt tên chứ không phải NativeNamedQueries? Tôi đã tìm kiếm hai giờ cố gắng tìm ra lý do tại sao truy vấn của tôi sẽ không hoạt động. – SoftwareSavant