簡體   English   中英

對 Spring Data Mongo 存儲庫提供限制

[英]Provide limit on Spring Data Mongo repository

使用最新的 Spring Data Mongo(撰寫本文時為 2.1.1),如何指定獲取“自定義”查詢方法的第一條記錄? 這是一個例子:

@Query(value="{name: ?0, approval: {'$ne': null}}",
        sort="{'approval.approvedDate': -1}",
        fields = "{ _id: 1 }")
List<Item> getLatestApprovedIdByName(String name, Pageable pageable);

/**
 * Finds the id of the most recently approved document with the given name.
 */
default Item getLatestApprovedIdByName(String name) {
    return getLatestApprovedIdByName(name, PageRequest.of(0, 1)).stream()
                                                                .findFirst()
                                                                .orElse(null);
}

理想情況下,我可以只使用String參數來注釋 getLatestApprvedIdByName 。

org.springframework.data.mongodb.repository.Query注釋上似乎沒有限制字段。

這似乎很奇怪,因為我可以模擬命名方法所做的所有事情,除了findFirst

如果沒有Pageable ,我會得到IncorrectResultSizeDataAccessException ,並且返回List是不可接受的,因為我不想浪費時間返回任意大的結果,以及需要處理 0 或 1 項可能性的復雜代碼。

因為您的查詢返回多個文檔,所以無法讓它直接返回單個Item

使用Stream

// Repository
@Query(value="{name: ?0, approval: {'$ne': null}}",
        sort="{'approval.approvedDate': -1}",
        fields = "{ _id: 1 }")
Stream<Item> getLatestApprovedIdByName(String name);

// Service
default Item getLatestApprovedIdByName(String name) {
    return getLatestApprovedIdByName(name).stream().findFirst().orElse(null);
}

由於Stream的工作方式,您將只獲取第一個查詢結果,而不是整個結果集。 有關詳細信息,請參閱文檔

使用PagePageable

// Repository
@Query(value = "{name: ?0, approval: {'$ne': null}}", fields = "{ _id: 1 }")
Page<Item> getLatestApprovedIdByName(String name, Pageable pageable);

// Service
default Item getLatestApprovedIdByName(String name) {
    PageRequest request = new PageRequest(0, 1, new Sort(Sort.Direction.DESC, "approval.approvedDate"));
    return getLatestApprovedIdByName(name, request).getContent().get(0);
}

通過使用PageRequest ,您可以指定所需的結果數量以及指定排序順序。 基於這個答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM