Spring Data MongoRepository查询排序

14

我想了解如何在存储库方法的查询注释中引入排序。我已经在谷歌和这里看到了这段代码,但我无法让它正常工作。

@Query("find({state:'ACTIVE'}).sort({created:-1}).limit(1)")
    Job findOneActiveOldest();

@Query("{ state:'ACTIVE', $orderby: {created:-1}, $limit:1 }")
Job findOneActiveOldest();
我知道可以通过分页来实现,但有些情况下我不需要分页,所以我想知道如何使用Query注释来实现。请给予建议。

有什么问题吗?为什么你不能使它不工作? - Erik Pragt
第一个会返回JSON解析异常,第二个则不会返回任何东西。 - paul
这不是你的问题吗?https://dev59.com/OWkw5IYBdhLWcg3wMHum - kabochkov
不,看一下那个问题的第二个答案,仔细阅读我的问题/回答。 - paul
3个回答

25

我认为使用@Query注释不可能实现这一点。如果您不需要分页,您可以只需使您的存储库方法使用Sort参数:

@Query("{ state:'ACTIVE' }")
Job findOneActive(Sort sort);

并使用它:

yourRepository.findOneActive(new Sort(Sort.Direction.DESC, "created"))

是一个好的解决方案,谢谢!但我仍然无法相信Query注释对于Mongo来说有多糟糕。 - paul
2
确实还有改进的空间。好消息是Spring源代码在Github上,所以您可以随时编写增强并创建合并请求。 - Maciej Walkowiak
2
如果我确实需要分页怎么办? - Nailgun
@MaciejWalkowiak 如何给这个添加限制。请给予建议。 - Mohanraj
如果您使用limit和offset,它将无法正常工作,这是一种解决方法。 - Sérgio Thiago Mendonça
现在,@Query 中可以进行限制和排序。 - Pushpender Singh

16

只需使用@Query注释的排序参数。1 = 升序,-1 = 降序

    @Query(
        value  = ...,
        sort = "{'details.requestTime': -1}"
    )

如何执行分组操作? - PAA
这是正确的响应,没有任何变通方法!非常好。 - Sérgio Thiago Mendonça

0
如果您还想要分页功能,请使用“Pageable”作为方法参数,而不是“Sort”。请尝试以下代码:
@Query("{ state:'ACTIVE' }")
Job findOneActive(Pageable pageable);

yourRepository.findOneActive(new PageRequest(0, 1, new Sort(Sort.Direction.DESC,"created")));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接