提供对Spring Data Mongo存储库的限制

时间:2018-10-24 18:29:08

标签: java mongodb spring-data spring-data-mongodb

使用最新的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”以外的所有命名方法。没有分页器,我得到IncorrectResultSizeDataAccessException,并且返回List是不可接受的,因为我不想浪费时间返回任意大的结果,以及需要处理0可能性的复杂代码或1个项目。

1 个答案:

答案 0 :(得分:0)

由于您的查询返回了多个文档,因此无法使其直接返回单个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的工作方式,您只会获取第一个查询结果,而不是整个结果集。有关更多信息,请参见documentation

使用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,您可以指定所需的结果数以及排序顺序。基于this answer