2012-04-08 8 views
11

私はMongoDBのSpring Dataを初めて使用していて、MongoRepository拡張インタフェース内にフィルタリング、ソート、および制限が必要な自動生成クエリメソッドを持っています。Springリポジトリインタフェースで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(); 

    ... 
} 

私は1つが、ソート得るために、クエリメソッドにソート引数を追加できることを知っているが、この問題は結果を1つのオブジェクトに限定しています。カスタムJobRepositoryImplを記述することなくこれを行うことは可能ですか?

おかげ

編集:私は探しています何の

例:

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

または

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

しかし、これは明らかに:(

答えて

24
を動作しません。

wroで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

+2

私はPageableクラスを調べるのに気を使わず、ソートsort-ofと組み合わせて.sort()と.limit()関数をラップしていることに気づかずに、 mongoクエリ。 – m1h4

+0

問題ありません、それはあなたのために働いてうれしい! :) –

7

をするだけオリバーの答えに補正を加えること、それが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

これはコメントであり、答えではありません。 –

+0

元の回答を編集することもできますが、これについて考えると、新しいユーザーにコメントや編集の担当者がいなくなります。 – shoover

+0

@Sinatrメタに関する「[このディスカッション](http://meta.stackoverflow.com/questions/260245/when-should-i-make-edits-to-code)」、特に「アンサーでのコードの編集」を参照してください。 TL; DR:SOは参考リソースであり、ゲームではありません。それが改善を生み出すなら、編集は奨励される。すべての編集内容が記録され、誰でも履歴を確認できます。 – shoover

関連する問題