在Spring Repository接口中使用sort()和limit()进行查询
我是Spring Data with MongoDB的新手,并希望在需要过滤,排序和限制的MongoRepository扩展接口中有一个自动生成的查询方法。在Spring Repository接口中使用sort()和limit()进行查询
查询看起来是这样的:
// '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();
...
}
我知道,一个可以为了得到排序添加一个排序参数的查询方法,但问题是将结果限制在一个对象中。这可能不需要编写自定义JobRepositoryImpl吗?
感谢
编辑:的
例子就是我在寻找:
@Query("{ state:'ACTIVE', $orderby: {created:-1}, $limit:1 }")
Job findOneActiveOldest();
或
@Query("{ state:'ACTIVE' }")
@Sort("{ created:-1 }")
@Limit(1)
Job findOneActiveOldest();
但是,这显然是行不通的:(
什么是与NG:
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);
只要添加一个修正奥利弗的回答,这是Direction.DESC
而不是Directions.DESC
和则params的顺序是错误的。
变化:
PageRequest request = new PageRequest(0, 1, new Sort("created", Directions.DESC));
到:
PageRequest request = new PageRequest(0, 1, new Sort(Direction.DESC, "created"));
这应该是一个评论,而不是一个答案。 – 2014-07-30 14:32:38
或编辑原始答案,但现在我想到了,新用户没有编辑评论或编辑。 – shoover 2014-07-30 14:35:42
@Sinatr在meta上看到[this discussion](http://meta.stackoverflow.com/questions/260245/when-should-i-make-edits-to-code),特别是“编辑代码在答案”部分。 TL; DR:SO是参考资源,而不是游戏;如果产生改进,编辑会受到鼓励;所有编辑都会记录下来,任何人都可以查看历史记录 – shoover 2014-07-30 16:40:36
感谢奥利弗,这正是我一直在寻找。 – m1h4 2012-04-11 00:40:19
我忙于寻找一个简短的查询式解决方案,我并不打算检查Pageable类,并意识到这与Sort排序相结合 - 包装了.sort()和.limit()函数一个mongo查询。 – m1h4 2012-04-11 07:34:07
没问题,很高兴为你工作! :) – 2012-04-11 13:51:26