2013-06-02 35 views
7

Tôi đang sử dụng truy vấn JPQL để kiểm tra xem danh sách có chứa các giá trị enum được chỉ định hay không. Nếu giá trị enum là một phần tử duy nhất để kiểm tra thì nó khá đơn giản.jpql IN truy vấn với giá trị enum

Trong biểu thức truy vấn,

query = "... where s.status = :status"; 

và sau đó thiết lập thông số như

query.setParameter("status", statusValue); 

Nhưng tôi muốn kiểm tra một cái gì đó như dưới đây

query = "... where s.status IN (:statusList)"; 

nơi statusList là một chuỗi các số (ví dụ: "0,1,2" có nghĩa là l ist of the status of status)

Nhưng tôi không thể tìm được giải pháp. Tôi cũng đã kiểm tra với s.status.ordinal() IN (statusList) trong truy vấn nhưng không có may mắn.

Tôi đang sử dụng JPA thực hiện: EclipseLink (JPA 2.0) tên thực

My Entity là SType

public enum SType 
{ 
    REQUISITION, 
    PURCHASE, 
    FINISHED, 
    // others 
    RETURN; 
} 

QUERY:

String querySt = "select s.slipType.slipNameSt,s.slipNumberSt, s.idNr from Slip s 
where s.slipType.sType IN (:enumTypeListt)"; 

em.createQuery(querySt).setParameter("enumTypeList", EnumSet.of(SType.REQUISITION, 
                   SType.PURCHASE)); 
+0

Bạn bền vững giá trị thứ tự trái với chuỗi? –

+0

@KevinBowersox: Có, trong cơ sở dữ liệu, tôi đã lưu trữ các giá trị thứ tự và trong front-end, Enum đại diện cho giá trị đó. – sarwar026

+0

Tôi khuyên bạn nên lưu trữ Chuỗi thực tế của enum trong cơ sở dữ liệu. Nếu enum của bạn bao giờ thay đổi bạn có thể cần phải thực hiện một số điều chỉnh dữ liệu trong cơ sở dữ liệu của bạn. –

Trả lời

12

Bạn không thể so sánh enums với chuỗi hoặc số nguyên. Trường liên tục là loại Trạng thái, là một enum (hoặc ít nhất, hãy giả sử kiểu là Trạng thái, vì bạn không chỉ định tên của lớp enum).

Vì vậy, những gì bạn phải vượt qua làm đối số cho bộ sưu tập trong mệnh đề IN là tập hợp Trạng thái. Ví dụ:

query = "... where s.status IN :statusList"; 
... 
q.setParameter("statusList", EnumSet.of(Status.APPROVED, Status.CLOSED)); 
+0

Tôi đã nhận được lỗi sau: "Bạn đã cố gắng thiết lập một giá trị của lớp loại java.util.RegularEnumSet cho tham số statusList với loại dự kiến ​​của lớp SType từ truy vấn ...". tôi có thể làm gì bây giờ? – sarwar026

+0

Bạn có chắc là bạn không thay thế 'IN' bằng' = '? Nếu không, vui lòng chỉnh sửa câu hỏi và cho chúng tôi biết bạn đang sử dụng triển khai JPA nào, hiển thị cho chúng tôi mã của pháp nhân và mã bạn đang sử dụng để thực hiện truy vấn cũng như theo dõi ngăn xếp hoàn chỉnh của ngoại lệ. –

+0

Xin lỗi, tôi đã gặp lỗi trong truy vấn của mình. Tôi đã sửa nó ngay bây giờ: không cần các dấu ngoặc đơn khơi dậy tham số statusList. –

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