Redis 特定的查询方法

查询方法允许根据方法名称自动派生出简单的查找查询,如下例所示:spring-doc.cadn.net.cn

示例 1. 示例仓库查询方法
public interface PersonRepository extends CrudRepository<Person, String> {

  List<Person> findByFirstname(String firstname);
}
请确保在查找方法中使用的属性已设置为可被索引。
Redis 仓库的查询方法仅支持对实体及带分页的实体集合进行查询。

使用派生查询方法可能并不总能满足建模查询的需求。RedisCallback 提供了对索引结构的实际匹配甚至自定义索引的更多控制。 为此,请提供一个 RedisCallback,该回调返回单个或 Iterable 类型的 id 值集合,如下例所示:spring-doc.cadn.net.cn

示例 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 支持的关键字,以及包含该关键字的方法本质上所对应的含义:spring-doc.cadn.net.cn

表1. 方法名中支持的关键字
关键字 示例 Redis 代码片段

Andspring-doc.cadn.net.cn

findByLastnameAndFirstnamespring-doc.cadn.net.cn

SINTER …:firstname:rand …:lastname:al’thorspring-doc.cadn.net.cn

Orspring-doc.cadn.net.cn

findByLastnameOrFirstnamespring-doc.cadn.net.cn

SUNION …:firstname:rand …:lastname:al’thorspring-doc.cadn.net.cn

Is, Equalsspring-doc.cadn.net.cn

findByFirstname, findByFirstnameIs, findByFirstnameEqualsspring-doc.cadn.net.cn

SINTER …:firstname:randspring-doc.cadn.net.cn

IsTruespring-doc.cadn.net.cn

FindByAliveIsTruespring-doc.cadn.net.cn

SINTER …:alive:1spring-doc.cadn.net.cn

IsFalsespring-doc.cadn.net.cn

findByAliveIsFalsespring-doc.cadn.net.cn

SINTER …:alive:0spring-doc.cadn.net.cn

Top,Firstspring-doc.cadn.net.cn

findFirst10ByFirstname,findTop5ByFirstnamespring-doc.cadn.net.cn

对查询方法结果进行排序

Redis 仓库支持多种方式来定义排序顺序。 Redis 本身在检索哈希(hashes)或集合(sets)时并不支持动态排序。 因此,Redis 仓库的查询方法会构建一个 Comparator,在将结果以 List 形式返回之前,先对结果应用该比较器。 让我们看一下以下示例:spring-doc.cadn.net.cn

示例 3. 对查询结果进行排序
interface PersonRepository extends RedisRepository<Person, String> {

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

  List<Person> findByFirstname(String firstname, Sort sort);   (2)
}
1 从方法名派生的静态排序。
2 使用方法参数进行动态排序。