【问题标题】:Query with sort() and limit() in Spring Repository interface在 Spring Repository 接口中使用 sort() 和 limit() 进行查询
【发布时间】:2015-07-22 03:45:42
【问题描述】:

我是 MongoDB 的 Spring Data 新手,我希望在我的 MongoRepository 扩展接口中有一个自动生成的查询方法,它需要过滤、排序和限制。

查询如下所示:

// 'created' is the field I need to sort against

find({state:'ACTIVE'}).sort({created:-1}).limit(1)

存储库界面如下所示:

public interface JobRepository extends MongoRepository<Job, String> {
    @Query("{ state: 'ACTIVE', userId: ?0 }")
    List<Job> findActiveByUserId(String userId);

    // The next line is the problem, it wont work since
    // it's not in the format @Query expects
    @Query("find({state:'ACTIVE'}).sort({created:-1}).limit(1)")
    Job findOneActiveOldest();

    ...
}

我知道可以将 Sort 参数添加到查询方法以进行排序,但问题是将结果限制为单个对象。无需编写自定义 JobRepositoryImpl 是否可以做到这一点?

谢谢

编辑:

我正在寻找的示例:

@Query("{ state:'ACTIVE', $orderby: {created:-1}, $limit:1 }")
Job findOneActiveOldest();

@Query("{ state:'ACTIVE' }")
@Sort("{ created:-1 }")
@Limit(1)
Job findOneActiveOldest();

但这显然行不通:(

【问题讨论】:

    标签: spring-data mongodb-java


    【解决方案1】:

    有什么问题:

    public interface JobRepository extends MongoRepository<Job, String> {
    
      @Query("{ state : 'ACTIVE' }")
      Page<Job> findOneActiveOldest(Pageable pageable);
    }
    

    并使用它:

    // Keep that in a constant if it stays the same
    PageRequest request = new PageRequest(0, 1, new Sort(Sort.Direction.DESC, "created"));
    Job job = repository.findOneActiveOldest(request).getContent().get(0);
    

    【讨论】:

    • 谢谢 Oliver,这正是我想要的。
    • 我正忙于寻找一个简短而简单的类似查询的解决方案,以至于我没有费心检查 Pageable 类并意识到这与 Sort 排序组合包装了 .sort()和 .limit() mongo 查询的功能。
    • 我知道这是旧线程,但是否可以说在这种情况下不要计算集合中的项目总数,因为 Page 被返回并且您在后台执行此操作(所以有2个查询:一个用于数据,一个用于计数),我知道@QueryHints(forCounting = false)或返回List而不是Page,但它在界面内工作,在repository.doSomething的情况下有没有@QueryHints的替代品()?
    • new PageRequest() 已弃用,因此我使用了 PageRequest.of()
    • 正如@TimeTraveler 所说,新的 PageRequest() 现在已被弃用。而是使用PageRequest request = PageRequest.of(0, 1, Sort.Direction.DESC, "created");
    【解决方案2】:

    只是对 Oliver 的答案进行更正,它是 Direction.DESC 而不是 Directions.DESC 并且参数的顺序是错误的。

    改变:

    PageRequest request = new PageRequest(0, 1, new Sort("created", Directions.DESC));
    

    到:

    PageRequest request = new PageRequest(0, 1, new Sort(Direction.DESC, "created"));
    

    【讨论】:

    • 这应该是评论而不是答案。
    • 或者编辑原始答案,但现在我想起来了,新用户没有代表评论或编辑。
    • @Sinatr 请参阅元数据上的this discussion,尤其是“在答案中编辑代码”部分。 TL;DR:SO 是参考资源,而不是游戏;如果能产生改进,则鼓励编辑;所有编辑都被记录下来,任何人都可以查看历史记录。
    • 我需要 50+ 的声誉来评论我想澄清的答案,所以请准确说明我应该如何澄清。
    • 谢谢!该代码对我有用,但有一个小的改动: Pageable pageable = new PageRequest(0, 1, new Sort(new Sort.Order(Direction.ASC, "name"), new Sort.Order(Direction.DESC, "fID") ));
    猜你喜欢
    • 2014-09-28
    • 2020-01-20
    • 1970-01-01
    • 2016-08-08
    • 2014-08-13
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    相关资源
    最近更新 更多