在Spring Repository接口中使用sort()和limit()进行查询

m1h*_*1h4 17 mongodb-java spring-data

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

查询如下所示:

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

find({state:'ACTIVE'}).sort({created:-1}).limit(1)
Run Code Online (Sandbox Code Playgroud)

存储库界面如下所示:

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();

    ...
}
Run Code Online (Sandbox Code Playgroud)

我知道可以将一个Sort参数添加到查询方法中以便进行排序,但问题是将结果限制为仅一个对象.这可以在不必编写自定义JobRepositoryImpl的情况下完成吗?

谢谢

编辑:

我正在寻找的例子:

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

要么

@Query("{ state:'ACTIVE' }")
@Sort("{ created:-1 }")
@Limit(1)
Job findOneActiveOldest();
Run Code Online (Sandbox Code Playgroud)

但这显然不起作用:(

Oli*_*ohm 34

有什么不对:

public interface JobRepository extends MongoRepository<Job, String> {

  @Query("{ state : 'ACTIVE' }")
  Page<Job> findOneActiveOldest(Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)

并使用它:

// 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);
Run Code Online (Sandbox Code Playgroud)

  • 我知道这是旧线程,但是可以说在这种情况下不计算集合中的项目总数,因为返回了Page并且你在引擎盖下执行此操作(因此有2个查询:一个用于数据我知道@QueryHints(forCounting = false)或者返回List而不是Page,但是它在接口内工作,在repository.doSomething()的情况下是否有@QueryHints的替代方法? (3认同)
  • 我正忙着寻找一个简短而简单的类似查询的解决方案,我没有费心去检查Pageable类,并且意识到这与Sort sort-of结合使用了.sort()和.limit()函数. mongo查询. (2认同)
  • 正如 @TimeTraveler 提到的 new PageRequest() 现已弃用。而是使用 `PageRequest request = PageRequest.of(0, 1, Sort.Direction.DESC, "created");` (2认同)

Mar*_*arc 9

只是对Oliver的答案添加一个修正,它是Direction.DESC和不是,Directions.DESC并且params的顺序是错误的.

变化:

PageRequest request = new PageRequest(0, 1, new Sort("created", Directions.DESC));
Run Code Online (Sandbox Code Playgroud)

至:

PageRequest request = new PageRequest(0, 1, new Sort(Direction.DESC, "created"));
Run Code Online (Sandbox Code Playgroud)

  • 这应该是评论,而不是答案. (9认同)