2010-03-24 38 views
9

Tôi đang gặp khó khăn khi xây dựng một truy vấn động bằng cách sử dụng CriteriaBuilder của JPA 2.0.Truy vấn JPA 2.0 động bằng cách sử dụng API tiêu chí

Tôi có khá một trường hợp sử dụng chung tôi đoán: Người dùng cung cấp một số lượng tùy ý các thông số tìm kiếm X được và/hoặc nối: như:

select e from Foo where (name = X1 or name = X2 .. or name = Xn) 

Phương pháp hay của CriteriaBuilder là không năng động:

Dành riêng hoặc (Hạn chế ... Dành riêng)

Ý tưởng? Mẫu?

Trả lời

7

Trong trường hợp của bạn, tôi thà sử dụng Expression#in(Collection) để tránh việc phải lặp và để xây dựng một hợp chất Predicate động:

CriteriaBuilder cb = em.getCriteriaBuilder(); 

CriteriaQuery<Foo> cq = cb.createQuery(Foo.class); 
Metamodel m = em.getMetamodel(); 
EntityType<Foo> Foo_ = m.entity(Foo.class); 
Root<Foo> foo = cq.from(Foo_); 
cq.where(my.get(Foo_.name).in(params)); 

Bạn có thể muốn kiểm tra Basic Type-Safe Queries Using the Criteria API and Metamodel API để biết thêm chi tiết.

+0

Xin chào, Pascal Thivent, Nếu params là truy vấn con, làm cách nào để viết mã? –

1

trong mã này Foo_.name sẽ cung cấp lỗi biên dịch. Vì trường không được khai báo trong đó. Tôi không thể hiểu được điều này. Hãy đề nghị tôi.

-raghu

+3

Ví dụ trên dựa trên một siêu mô hình của các lớp được quản lý của đơn vị persistence (có thể được tạo ra bằng cách sử dụng một bộ xử lý chú thích được cung cấp bởi việc thực hiện JPA). Tuy nhiên, vui lòng không đăng câu hỏi dưới dạng câu trả lời trong chuỗi hiện có, thay vào đó, hãy mở một câu hỏi mới. –

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