22

私は 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 引数を追加できることはわかっていますが、問題は結果を 1 つのオブジェクトだけに制限することです。カスタムの JobRepositoryImpl を書かなくても、これを行うことは可能ですか?

ありがとう

編集:

私が探しているものの例:

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

また

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

しかし、これは明らかに機能しません:(

4

2 に答える 2

45

どうしたの:

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);
于 2012-04-09T18:02:20.880 に答える
9

オリバーの答えに修正を加えるだけで、そうで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"));
于 2014-07-30T14:23:30.680 に答える