Redis 固有のクエリメソッド

次の例に示すように、クエリメソッドを使用すると、メソッド名から単純なファインダークエリを自動的に導出できます。

例 1: サンプルリポジトリファインダーメソッド
public interface PersonRepository extends CrudRepository<Person, String> {

  List<Person> findByFirstname(String firstname);
}
ファインダーメソッドで使用されるプロパティがインデックス作成用に設定されていることを確認してください。
Redis リポジトリのクエリメソッドは、ページングを使用したエンティティおよびエンティティのコレクションのクエリのみをサポートします。

派生クエリメソッドを使用しても、実行するクエリをモデル化するのに必ずしも十分ではない場合があります。RedisCallback は、インデックス構造またはカスタムインデックスの実際のマッチングをより細かく制御できます。これを行うには、次の例に示すように、id 値の単一または Iterable セットを返す RedisCallback を提供します。

例 2: RedisCallback を使用したサンプルファインダー
String user = //...

List<RedisSession> sessionsByUser = template.find(new RedisCallback<Set<byte[]>>() {

  public Set<byte[]> doInRedis(RedisConnection connection) throws DataAccessException {
    return connection
      .sMembers("sessions:securityContext.authentication.principal.username:" + user);
  }}, RedisSession.class);

次の表は、Redis でサポートされているキーワードの概要と、そのキーワードを含むメソッドが基本的に何に変換されるかを示しています。

表 1: メソッド名内でサポートされているキーワード
キーワード サンプル Redis スニペット

And

findByLastnameAndFirstname

SINTER …:firstname:rand …:lastname:al’thor

Or

findByLastnameOrFirstname

SUNION …:firstname:rand …:lastname:al’thor

Is, Equals

findByFirstname, findByFirstnameIs, findByFirstnameEquals

SINTER …:firstname:rand

IsTrue

FindByAliveIsTrue

SINTER …:alive:1

IsFalse

findByAliveIsFalse

SINTER …:alive:0

Top,First

findFirst10ByFirstname,findTop5ByFirstname

クエリメソッドの結果の並べ替え

Redis リポジトリでは、さまざまなアプローチでソート順を定義できます。Redis 自体は、ハッシュまたはセットを取得する際の実行中の並べ替えをサポートしていません。Redis リポジトリクエリメソッドは、結果を List として返す前に、結果に適用される Comparator を構築します。次の例を見てみましょう。

例 3: クエリ結果の並べ替え
interface PersonRepository extends RedisRepository<Person, String> {

  List<Person> findByFirstnameOrderByAgeDesc(String firstname); (1)

  List<Person> findByFirstname(String firstname, Sort sort);   (2)
}
1 メソッド名から派生した静的ソート。
2 メソッド引数を使用した動的ソート。