在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); 
+0

感谢奥利弗,这正是我一直在寻找。 – m1h4 2012-04-11 00:40:19

+2

我忙于寻找一个简短的查询式解决方案,我并不打算检查Pageable类,并意识到这与Sort排序相结合 - 包装了.sort()和.limit()函数一个mongo查询。 – m1h4 2012-04-11 07:34:07

+0

没问题,很高兴为你工作! :) – 2012-04-11 13:51:26

只要添加一个修正奥利弗的回答,这是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")); 
+7

这应该是一个评论,而不是一个答案。 – 2014-07-30 14:32:38

+0

或编辑原始答案,但现在我想到了,新用户没有编辑评论或编辑。 – shoover 2014-07-30 14:35:42

+0

@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