此版本仍在开发中,尚未被视为稳定版本。如需最新稳定版本,请使用 Spring Data Cassandra 5.0.4spring-doc.cadn.net.cn

Cassandra 特定的查询方法

本章介绍Cassandra特有的查询方法。 本文档使用命令式返回类型。 通过使用响应式返回类型,同样的语义也适用于响应式仓库。

你在仓库上触发的大多数数据访问操作都会导致在 Apache Cassandra 数据库上执行一个查询。 定义这样的查询只需在仓库接口中声明一个方法即可。 以下示例展示了多个此类方法声明:spring-doc.cadn.net.cn

带有查询方法的 PersonRepository
interface PersonRepository extends CrudRepository<Person, String> {

    List<Person> findByLastname(String lastname);                           (1)

    Slice<Person> findByFirstname(String firstname, Pageable pageRequest);  (2)

    Window<Person> findByFirstname(String firstname, CassandraScrollPosition pos, Limit limit);  (3)

    List<Person> findByFirstname(String firstname, QueryOptions opts);      (4)

    List<Person> findByFirstname(String firstname, Sort sort);              (5)

    List<Person> findByFirstname(String firstname, Limit limit);            (6)

    Person findByShippingAddress(Address address);                          (7)

    Person findFirstByShippingAddress(Address address);                     (8)

    Stream<Person> findAllBy();                                             (9)

    @AllowFiltering
    List<Person> findAllByAge(int age);                                     (10)
}
1 该方法展示了一个查询,用于查找所有具有指定lastname的人员。 该查询是通过解析方法名称中的约束条件生成的,这些约束条件可以用And连接。 因此,该方法名会生成如下的查询表达式:SELECT * FROM person WHERE lastname = 'lastname'
2 对查询应用分页。 您可以在方法签名中添加一个 Pageable 参数,并让方法返回一个 Slice 实例,我们将自动为该查询进行相应的分页。
3 对查询应用滚动(scrolling)。 滚动将 Cassandra 的 PagingState 封装为 CassandraScrollPosition,并支持动态限制结果数量。 你也可以使用 findTop… 来设置静态限制。
4 传递一个 QueryOptions 对象会在查询执行之前将查询选项应用到生成的查询中。
5 对查询应用动态排序。 您可以在方法签名中添加一个 Sort 参数,Spring Data 会自动为查询应用排序。
6 对查询应用动态结果限制。 可以使用 SELECT … LIMIT 来限制查询结果。
7 展示了可以通过在 Converter 中注册的 CustomConversions 实例,基于非原始类型的属性进行查询。 如果找到多个匹配项,则抛出 IncorrectResultSizeDataAccessException 异常。
8 使用 First 关键字将查询限制为仅返回第一个结果。 与前面的方法不同,此方法在找到多个匹配项时不会抛出异常。
9 使用 Java 8 的 Stream 在遍历流的同时读取并转换各个元素。
10 展示了一个使用 @AllowFiltering 注解的查询方法,以允许服务器端过滤。
interface ReactivePersonRepository extends ReactiveSortingRepository<Person, Long> {

  Flux<Person> findByFirstname(String firstname);                                (1)

  Flux<Person> findByFirstname(Publisher<String> firstname);                     (2)

  Mono<Person> findByFirstnameAndLastname(String firstname, String lastname);    (3)

  Mono<Person> findFirstByFirstname(String firstname);                           (4)

  @AllowFiltering
  Flux<Person> findByAge(int age);                                               (5)
}
1 查询所有具有给定 firstname 的人员。 该查询通过解析方法名中的约束条件生成,这些约束条件可以用 AndOr 连接。 因此,该方法名将生成查询表达式 SELECT * FROM person WHERE firstname = :firstname
2 一个查询,用于查找所有具有指定 firstname 的人员,该 firstname 由给定的 Publisher 发出后执行。
3 根据给定条件查找单个实体。 当结果不唯一时,会抛出 IncorrectResultSizeDataAccessException 异常。
4 与前面的查询不同,即使查询返回了更多的结果行,第一个实体也始终会被返回。
5 一个使用 @AllowFiltering 注解的查询方法,该注解允许在服务器端进行过滤。
查询非主键属性需要使用二级索引。

下表展示了可在查询方法中使用的关键词的简短示例:spring-doc.cadn.net.cn

表1. 查询方法支持的关键字
关键字 示例 逻辑结果

Afterspring-doc.cadn.net.cn

findByBirthdateAfter(Date date)spring-doc.cadn.net.cn

birthdate > datespring-doc.cadn.net.cn

GreaterThanspring-doc.cadn.net.cn

findByAgeGreaterThan(int age)spring-doc.cadn.net.cn

age > agespring-doc.cadn.net.cn

GreaterThanEqualspring-doc.cadn.net.cn

findByAgeGreaterThanEqual(int age)spring-doc.cadn.net.cn

age >= agespring-doc.cadn.net.cn

Beforespring-doc.cadn.net.cn

findByBirthdateBefore(Date date)spring-doc.cadn.net.cn

birthdate < datespring-doc.cadn.net.cn

LessThanspring-doc.cadn.net.cn

findByAgeLessThan(int age)spring-doc.cadn.net.cn

age < agespring-doc.cadn.net.cn

LessThanEqualspring-doc.cadn.net.cn

findByAgeLessThanEqual(int age)spring-doc.cadn.net.cn

age ⇐ agespring-doc.cadn.net.cn

Betweenspring-doc.cadn.net.cn

findByAgeBetween(int from, int to)findByAgeBetween(Range<Integer> range)spring-doc.cadn.net.cn

age > from AND age < to 以及根据 > 确定的下界/上界(>=<Rangespring-doc.cadn.net.cn

Inspring-doc.cadn.net.cn

findByAgeIn(Collection ages)spring-doc.cadn.net.cn

age IN (ages…​)spring-doc.cadn.net.cn

Like, StartingWith, EndingWithspring-doc.cadn.net.cn

findByFirstnameLike(String name)spring-doc.cadn.net.cn

firstname LIKE (name as like expression)spring-doc.cadn.net.cn

Containing 用于 Stringspring-doc.cadn.net.cn

findByFirstnameContaining(String name)spring-doc.cadn.net.cn

firstname LIKE (name as like expression)spring-doc.cadn.net.cn

Containing 用于集合spring-doc.cadn.net.cn

findByAddressesContaining(Address address)spring-doc.cadn.net.cn

addresses CONTAINING addressspring-doc.cadn.net.cn

(No keyword)spring-doc.cadn.net.cn

findByFirstname(String name)spring-doc.cadn.net.cn

firstname = namespring-doc.cadn.net.cn

IsTrue, Truespring-doc.cadn.net.cn

findByActiveIsTrue()spring-doc.cadn.net.cn

active = truespring-doc.cadn.net.cn

IsFalse, Falsespring-doc.cadn.net.cn

findByActiveIsFalse()spring-doc.cadn.net.cn

active = falsespring-doc.cadn.net.cn

仓库删除查询

上表中的关键字可与 delete…By 结合使用,以创建用于删除匹配文档的查询。spring-doc.cadn.net.cn

interface PersonRepository extends Repository<Person, String> {

  void deleteWithoutResultByLastname(String lastname);

  boolean deleteByLastname(String lastname);
}
interface PersonRepository extends Repository<Person, String> {

  Mono<Void> deleteWithoutResultByLastname(String lastname);

  Mono<Boolean> deleteByLastname(String lastname);
}

删除查询返回该查询是否已执行,或者使用 void 终止而不返回任何值。spring-doc.cadn.net.cn

查询选项

你可以通过传递一个 QueryOptions 对象来为查询方法指定查询选项。 这些选项会在实际执行查询之前应用到查询中。 QueryOptions 被视为非查询参数,不会被当作查询参数值处理。 查询选项适用于派生的以及使用字符串形式 @Query 注解的仓库方法。spring-doc.cadn.net.cn

要静态设置一致性级别,请在查询方法上使用 @Consistency 注解。 每次执行查询时,都会应用所声明的一致性级别。 以下示例将一致性级别设置为 ConsistencyLevel.LOCAL_ONEspring-doc.cadn.net.cn

interface PersonRepository extends CrudRepository<Person, String> {

    @Consistency(ConsistencyLevel.LOCAL_ONE)
    List<Person> findByLastname(String lastname);

    List<Person> findByFirstname(String firstname, QueryOptions options);
}
interface PersonRepository extends ReactiveCrudRepository<Person, String> {

    @Consistency(ConsistencyLevel.LOCAL_ONE)
    Flux<Person> findByLastname(String lastname);

    Flux<Person> findByFirstname(String firstname, QueryOptions options);
}

DataStax Cassandra 文档中包含对可用一致性级别的详细讨论。spring-doc.cadn.net.cn

你可以通过在 CQL API 实例(CqlTemplateAsyncCqlTemplateReactiveCqlTemplate)上配置以下参数,来控制获取大小(fetch size)、一致性级别(consistency level)和重试策略(retry policy)的默认值。 如果未设置特定的查询选项,则会应用这些默认值。