2015-11-11 29 views
9

Tôi có một dịch vụ REST đơn giản truy cập dữ liệu với Spring boot CrudRepository.Lọc dữ liệu với Spring boot CrudRepository

kho này đã thực hiện pagination và khả năng sắp xếp như thế này:

public interface FlightRepository extends CrudRepository<Flight, Long> { 
    List<Flight> findAll(Pageable pageable); 
} 

Gọi nó:

Sort sort = new Sort(direction, ordering); 
PageRequest page = new PageRequest(xoffset, xbase, sort); 

return flightRepo.findAll(page); 

Tôi muốn thêm cũng lọc để kho này (ví dụ trở lại chỉ tổ chức với id > 13 AND id < 27). CrudRepository dường như không hỗ trợ chức năng này. Có cách nào để đạt được điều này hay tôi cần phải sử dụng cách tiếp cận khác nhau?

Cảm ơn mọi mẹo!

Trả lời

7

Một cách khác, điều này sẽ giải quyết mối quan tâm của bạn trong các nhận xét ở trên về việc phải tạo phương pháp truy vấn cho mọi kết hợp tham số, là sử dụng mẫu Đặc điểm kỹ thuật qua API tiêu chí hoặc bằng cách sử dụng QueryDSL.

Cả hai phương pháp được trình bày ở dưới đây để đáp ứng với những lo ngại rằng:

số các phương pháp truy vấn có thể phát triển cho các ứng dụng lớn hơn bởi vì của - và đó là điểm thứ hai - các truy vấn định nghĩa một tập cố định trong số tiêu chí. Để tránh hai nhược điểm này, sẽ không hay nếu bạn có thể đưa ra một tập hợp các biến vị ngữ nguyên tử mà bạn có thể kết hợp động để tạo truy vấn của mình?

https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

tôi thấy dễ dàng hơn QueryDSL một chút để làm việc với. Bạn chỉ cần xác định một phương thức giao diện mà sau đó bạn có thể chuyển bất kỳ kết hợp tham số nào thành vị từ.

ví dụ:

public interface UserRepository extends PagingAndSortingRepository<User, Long>, QueryDslPredicateExecutor<User> { 
    public List<User> findAll(Predicate predicate); 
} 

và truy vấn:

repository.findAll(QUser.user.address.town.eq("Glasgow").and(QUser.user.gender.eq(Gender.M))); 

repository.findAll(QUser.user.address.town.eq("Edinburgh")); 

repository.findAll(QUser.user.foreName.eq("Jim")); 

nơi QUser là một QueryDSL tự động tạo ra lớp.

http://docs.spring.io/spring-data/jpa/docs/current/api/index.html?org/springframework/data/jpa/repository/support/QueryDslRepositorySupport.html

http://www.querydsl.com/static/querydsl/2.1.0/reference/html/ch02s02.html

Cập nhật

Từ việc phát hành Gosling của các module dữ liệu mùa xuân có bây giờ hỗ trợ cho thế hệ ngữ tự động từ các thông số HTTP trong một ứng dụng web.

https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release-gosling#querydsl-web-support

0

Khai báo các chức năng dưới đây trong kho [EDITED]

Page<Flight> findByIdBetween(Long start, Long end, Pageable pageable) 

của bạn Sau đó, bạn có thể gọi chức năng này từ trường hợp của kho. Vui lòng tham khảo spring-data reference để biết thêm thông tin ..

+0

Điều này có thể được kết hợp với Pageable không? Tôi đã hy vọng rằng tôi có thể xác định điều này trong một số đối tượng và chuyển nó vào chức năng. Đây không phải là rất tiện dụng khi muốn một số tính linh hoạt (người dùng có thể chỉ định trường tùy chỉnh để được lọc và tôi sẽ phải chỉ định một chức năng như thế này cho mọi kết hợp có thể ...) – Smajl

+0

vâng, bạn có thể sử dụng simpy 'List findByIdBetween (Bắt đầu dài , Long end, Pageable pageable) ' – pezetem

+0

cũng khuyên bạn nên thay đổi giao diện mở rộng thành' PagingAndSortingRepository' .. –

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