2012-04-08 42 views
11

Tôi mới sử dụng Dữ liệu Mùa xuân với MongoDB và muốn có một phương thức truy vấn được tạo tự động trong giao diện mở rộng MongoRepository yêu cầu lọc, phân loại và hạn chế.Truy vấn với sắp xếp() và giới hạn() trong giao diện Kho lưu trữ Mùa xuân

Truy vấn trông như thế này:

// 'created' is the field I need to sort against 

find({state:'ACTIVE'}).sort({created:-1}).limit(1) 

Giao diện kho trông như thế này:

public interface JobRepository extends MongoRepository<Job, String> { 
    @Query("{ state: 'ACTIVE', userId: ?0 }") 
    List<Job> findActiveByUserId(String userId); 

    // The next line is the problem, it wont work since 
    // it's not in the format @Query expects 
    @Query("find({state:'ACTIVE'}).sort({created:-1}).limit(1)") 
    Job findOneActiveOldest(); 

    ... 
} 

Tôi biết rằng người ta có thể thêm một Sắp xếp tranh luận đến một phương pháp truy vấn để có được sắp xếp nhưng vấn đề là hạn chế kết quả chỉ với một đối tượng duy nhất. Điều này có thể làm mà không cần phải viết một JobRepositoryImpl tùy chỉnh?

Cảm ơn

Edit:

Ví dụ về những gì tôi đang tìm kiếm:

@Query("{ state:'ACTIVE', $orderby: {created:-1}, $limit:1 }") 
Job findOneActiveOldest(); 

hoặc

@Query("{ state:'ACTIVE' }") 
@Sort("{ created:-1 }") 
@Limit(1) 
Job findOneActiveOldest(); 

Nhưng điều này rõ ràng là không hoạt động :(

Trả lời

24

Điều gì đang xảy ra ng với:

public interface JobRepository extends MongoRepository<Job, String> { 

    @Query("{ state : 'ACTIVE' }") 
    Page<Job> findOneActiveOldest(Pageable pageable); 
} 

và sử dụng nó:

// Keep that in a constant if it stays the same 
PageRequest request = new PageRequest(0, 1, new Sort(Sort.Direction.DESC, "created")); 
Job job = repository.findOneActiveOldest(request).getContent().get(0); 
+0

Cảm ơn Oliver, đây là chính xác những gì tôi đang tìm kiếm. – m1h4

+2

Tôi đã rất bận rộn tìm kiếm một giải pháp giống như truy vấn ngắn và đơn giản mà tôi không bận tâm để kiểm tra lớp Có thể đánh số và nhận ra rằng điều này kết hợp với Sắp xếp sắp xếp kết thúc các hàm .sort() và .limit() của một truy vấn mongo. – m1h4

+0

Không có vấn đề, vui mừng vì nó đã làm việc cho bạn! :) –

7

Chỉ cần thêm một sự điều chỉnh để câu trả lời của Oliver, đó là Direction.DESC và không Directions.DESC và thứ tự của các params là sai.

Thay đổi:

PageRequest request = new PageRequest(0, 1, new Sort("created", Directions.DESC)); 

tới:

PageRequest request = new PageRequest(0, 1, new Sort(Direction.DESC, "created")); 
+7

Đây phải là nhận xét chứ không phải là câu trả lời. –

+0

Hoặc chỉnh sửa câu trả lời gốc, nhưng bây giờ tôi nghĩ về nó, người dùng mới không có đại diện để bình luận HOẶC chỉnh sửa. – shoover

+0

@Sinatr xem [thảo luận này] (http://meta.stackoverflow.com/questions/260245/when-should-i-make-edits-to-code) trên meta, đặc biệt là phần "Chỉnh sửa mã trong câu trả lời". TL; DR: SO là một tài nguyên tham khảo, không phải là một trò chơi; chỉnh sửa được khuyến khích nếu nó tạo ra cải tiến; tất cả chỉnh sửa được ghi lại và bất kỳ ai cũng có thể xem lại lịch sử. – shoover

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