2009-12-22 26 views
7

Tôi đang cố gắng để thiết lập một tham số trong truy vấn của tôi, ví dụ:JPA setParameter khi giao dịch với "logic NOT IN (: param)"

select * from Cars where Cars.color NOT IN (:color_params) 

Và khi tôi thêm các tham số trong JavaClass của tôi là như:

... 
query.setParameter("color_params", "RED,BLUE"); 
... 

Và điều này không làm việc, chỉ làm việc với chỉ có một tham số.
Tôi đã thử với "'RED','BLUE'" và không hoạt động.

Nếu tôi đặt các thông số của tôi trong truy vấn đang làm việc ví dụ:

select * from Cars where Cars.color NOT IN ('RED','BLUE') 

Những gì tôi đang làm sai !?

Cảm ơn trước

Trả lời

12

Bạn có nghĩa vụ phải vượt qua Danh sách.

List<String> colors = ....; 
String query = "select * from Cars where Cars.color NOT IN (:color_params)"; 
Map<String, Object> params = new HashMap<String, Object>(); 
params.put("color_params", colors); 
// ... execute the query with the param. 

Bạn cũng có thể làm:

query.setParameter("color_params", colors); 

Theo nguyên tắc chung, nó thường được ưa thích để truyền tham số cho một truy vấn cố định, thay vì tùy biến String. Những lợi thế có thể là:

  1. Giảm phân tích: thực hiện JPA (ít nhất là Hibernate) có một công việc khó khăn phân tích mỗi truy vấn. Vì vậy, truy vấn được phân tích cú pháp đi vào bộ nhớ cache, để được sử dụng lại. Nếu chuỗi truy vấn được xây dựng trong thời gian chạy từ các tham số, nó có thể không bao giờ là hai lần giống nhau, do đó, rất nhiều thời gian, sức mạnh tính toán và bộ nhớ cache bị mất. Nhưng nếu bạn sử dụng cùng một chuỗi truy vấn với các tham số khác nhau, bingo: nhanh, sử dụng bộ nhớ thấp, yêu cầu cpu thấp.
  2. Ngăn chặn tiêm SQL. Đảm bảo này được cung cấp nếu bạn sử dụng các thông số. Nếu bạn xây dựng chuỗi truy vấn của bạn với các tham số, bạn phải cung cấp cho mình bảo lãnh này ...!
+0

Cảm ơn .... hoạt động một cách duyên dáng! –

+0

KLE: từ đâu bạn nhận được 2 viên đạn này? –

+1

@Castanho ** bullet number 1 and 2? ** Chỉ cần viết '1.' trên một dòng mới, được đặt trước bởi một dòng trống. [Các con số được tính toán tự động, bạn có thể viết '1.' cho tất cả chúng: phong cách Wiki]. Khi viết câu hỏi hoặc câu trả lời, cột bên phải cung cấp cho bạn rất nhiều tùy chọn ... ;-) – KLE

1

Bạn phải chuyển vào danh sách các chuỗi chứ không phải một chuỗi. JPA không phân tích các giá trị của bạn, bạn phải tách chúng ra.

+0

Thanks .... works gracefully! –

Các vấn đề liên quan