【发布时间】:2018-10-24 18:29:08
【问题描述】:
使用最新的 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 项可能性的复杂代码。
【问题讨论】:
-
几个问题。您的查询是否返回超过 1 个项目?什么时候抛出
IncorrectResultSizeDataAccessException?当你指定方法为List<Item> getLatestApprovedIdByName(String name);? -
是的,有很多文档与查询匹配。我想要最新批准的。如果我可以创建一个像 findFirstByNameOrderByApprovedDateDesc 这样的方法,它会做我想要的,除了查询和排序太复杂而无法放入方法名称,正如您在我的示例中看到的那样,因为我正在查看嵌套字段。
标签: java mongodb spring-data spring-data-mongodb