2012-04-23 56 views
10

Tôi đang sử dụng JPA dữ liệu mùa xuân và cố gắng thêm truy vấn vào kho lưu trữ của mình. Tôi đã cố gắng để chỉ cần xây dựng các truy vấn mà không có chú thích @Query như:Dữ liệu JPA Spring "OR" truy vấn

List<Item> findByTypeAndStateOrStateAndStartDateBetween(Type type, State s, State s2, Date startDate, Date endDate); 

Mục tiêu của tôi là xây dựng một truy vấn như vậy:

select * from item where type = ? and (state = ? or state = ?) and start_date between ? and ? 

Vấn đề của tôi là với OR khoản. Có cách nào để đảm bảo có dấu ngoặc vuông không? Nếu không, logic không đúng. Các ví dụ tôi tìm thấy ở đây: http://static.springsource.org/spring-data/data-jpa/docs/1.0.0.M1/reference/html/#jpa.query-methods.query-creation

không có bất kỳ hoặc mệnh đề nào có nhiều hơn 1 cột.

Ngoài ra, có cách nào để chuyển vào Danh sách đối tượng không. Ví dụ: nếu tôi muốn tìm các mục có 3 trạng thái, tôi sẽ phải tạo một truy vấn khác, truy vấn này không có tỷ lệ rất tốt.

Cảm ơn.

EDIT:

Tôi đã tìm cách chuyển danh sách các tiểu bang bằng ký hiệu @Query. Bạn làm như vậy:

@Query("FROM item i WHERE i.type = ?1 AND i.state IN (?2)") 

Sau đó, bạn chỉ có thể chuyển danh sách vào phương thức làm tham số thứ hai. Vẫn không biết cách thực hiện điều này mà không sử dụng ký hiệu @Query.

+3

Tôi nghĩ rằng đây là lý do tại sao mùa xuân dữ liệu cho phép bạn chỉ định truy vấn, nó chỉ có thể đi xa trong việc xác định những gì bạn muốn từ tên phương pháp riêng. Nó là tốt cho các truy vấn đơn giản nhưng một khi bạn tăng sự phức tạp, bạn tốt hơn nói cho nó chính xác những gì bạn muốn thay vì làm cho nó đoán. – Thevenin

+0

Cộng với @Query dễ đọc hơn nhiều so với tên phương thức dài. – skel625

+0

Cảm ơn, đây là kết luận tôi cũng đã đến. Chỉ cần sử dụng một @Query. – devo

Trả lời

1

Vâng, bạn rất thân thiết. Để làm điều này mà không @Query từ khóa In hoặc IsIn thể được sử dụng (không chắc chắn liệu những từ khóa được hỗ trợ tại thời điểm câu hỏi được hỏi):

List<Item> findByTypeAndStateInAndStartDateBetween(Type type, Collection<State> states, Date startDate, Date endDate); 

Trong và NotIn cũng mất bất kỳ lớp con của Bộ sưu tập như tham số cũng như làm mảng hoặc varargs. Đối với các phiên bản cú pháp khác của cùng một kiểm tra vận hành lôgic logic Repository query keywords.

Điều này sẽ đáp ứng nhu cầu của bạn về việc vượt qua bất kỳ số trạng thái nào cho các tiêu chí HOẶC.

tham khảo: Bảng 4. từ khóa được hỗ trợ bên trong tên phương pháp trong Query creation docs

+0

Cảm ơn. Những từ khóa này không có sẵn khi tôi hỏi câu hỏi này. – devo

2

Tôi muốn làm điều tương tự với việc nhận tất cả dữ liệu cho một trạm cụ thể, đó là giữa hai ngày.

findByStartdateBetweenOrEnddateBetweenAndStation(start,end,start,end,station) 
Gives you ==> 
SELECT...WHERE (startdate between start,end) OR (enddatebetween start,end AND station=station) 

Và:

findByStationAndStartdateBetweenOrEnddateBetween(station, start,end,start,end) 
Gives you ==> 
SELECT...WHERE (station=station AND startdate between start,end) OR enddatebetween start,end 

Cả hai đều sai như tôi muốn:

SELECT...WHERE station=station AND (startdate between start,end OR enddatebetween start,end) 

Sử dụng @Query rất cụ thể và không có cơ hội trộn VÀ của bạn/HOẶC với tên phương thức.

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