Предоставить лимит на хранилище Spring Data Mongo - PullRequest
0 голосов
/ 24 октября 2018

Используя последнюю версию 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);
}

В идеале я мог бы просто аннотировать getLatestApprvedIdByName, принимая только параметр String.Кажется, в аннотации org.springframework.data.mongodb.repository.Query нет предельного поля.Это кажется странным, потому что я могу эмулировать все, что делают именованные методы, кроме "findFirst".Без Pageable я получаю IncorrectResultSizeDataAccessException, а возвращать List недопустимо, потому что я не хочу тратить время на возвращение произвольно большого результата, плюс сложный код, требующий обработки 0 или 1 элементов.

1 Ответ

0 голосов
/ 25 октября 2018

Поскольку ваш запрос возвращает несколько документов, невозможно заставить его вернуть один 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работает, вы получите только первый результат запроса вместо всего набора результатов.Для получения дополнительной информации см. Документацию .

Использование Page и Pageable

// 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, вы можете указать, какмногие результаты, которые вы хотите, а также указать порядок сортировки.На основании этого ответа .

...