本章介绍特定于 Cassandra 的查询方法。 本文档使用命令式类型。 通过使用反应式返回类型,相同的语义也适用于反应式存储库。

通常在存储库上触发的大多数数据访问操作都会导致对 Apache Cassandra 数据库执行查询。 定义这样的查询是在存储库接口上声明方法的问题。 下面的示例显示了许多此类方法声明:

具有查询方法的 PersonRepository
  • Imperative

  • Reactive

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 该方法显示对具有给定 . 查询是从分析约束的方法名称派生的,该约束可以与 连接。 因此,方法名称将生成 .lastnameAndSELECT * FROM person WHERE lastname = 'lastname'
2 将分页应用于查询。 您可以为方法签名配备一个参数,让方法返回一个实例,我们会相应地自动对查询进行分页。PageableSlice
3 将滚动应用于查询。 滚动将 Cassandra 包装成并允许动态限制。 您也可以用于静态限制。PagingStateCassandraScrollPositionfindTop…
4 传递对象会在执行之前将查询选项应用于生成的查询。QueryOptions
5 将动态排序应用于查询。 您可以向方法签名添加参数,Spring Data 会自动将排序应用于查询。Sort
6 将动态结果限制应用于查询。 可以使用 来限制查询结果。SELECT … LIMIT
7 演示可以使用在 中注册的实例基于非基元类型的属性进行查询。 如果找到多个匹配项,则进行抛出。ConverterCustomConversionsIncorrectResultSizeDataAccessException
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 对具有给定 . 查询是通过分析约束的方法名称派生的,约束可以与 和 连接。 因此,方法名称将生成 .firstnameAndOrSELECT * FROM person WHERE firstname = :firstname
2 对具有给定的所有人的查询,一旦从给定的 发出 。firstnamefirstnamePublisher
3 查找给定条件的单个实体。 完成非唯一结果。IncorrectResultSizeDataAccessException
4 与前面的查询不同,即使查询生成更多结果行,也始终发出第一个实体。
5 用 注释的查询方法,允许服务器端筛选。@AllowFiltering
查询非主键属性需要二级索引。

下表显示了可在查询方法中使用的关键字的简短示例:

表 1.查询方法支持的关键字
关键词 样本 合乎逻辑的结果

After

findByBirthdateAfter(Date date)

birthdate > date

GreaterThan

findByAgeGreaterThan(int age)

age > age

GreaterThanEqual

findByAgeGreaterThanEqual(int age)

age >= age

Before

findByBirthdateBefore(Date date)

birthdate < date

LessThan

findByAgeLessThan(int age)

age < age

LessThanEqual

findByAgeLessThanEqual(int age)

age ⇐ age

Between

findByAgeBetween(int from, int to)findByAgeBetween(Range<Integer> range)

age > from AND age < to和 下限/上限 ( / & / ) 根据>>=<Range

In

findByAgeIn(Collection ages)

age IN (ages…​)

Like, ,StartingWithEndingWith

findByFirstnameLike(String name)

firstname LIKE (name as like expression)

Containing在字符串上

findByFirstnameContaining(String name)

firstname LIKE (name as like expression)

Containing关于收藏

findByAddressesContaining(Address address)

addresses CONTAINING address

(No keyword)

findByFirstname(String name)

firstname = name

IsTrue,True

findByActiveIsTrue()

active = true

IsFalse,False

findByActiveIsFalse()

active = false

本章介绍特定于 Cassandra 的查询方法。 本文档使用命令式类型。 通过使用反应式返回类型,相同的语义也适用于反应式存储库。
1 该方法显示对具有给定 . 查询是从分析约束的方法名称派生的,该约束可以与 连接。 因此,方法名称将生成 .lastnameAndSELECT * FROM person WHERE lastname = 'lastname'
2 将分页应用于查询。 您可以为方法签名配备一个参数,让方法返回一个实例,我们会相应地自动对查询进行分页。PageableSlice
3 将滚动应用于查询。 滚动将 Cassandra 包装成并允许动态限制。 您也可以用于静态限制。PagingStateCassandraScrollPositionfindTop…
4 传递对象会在执行之前将查询选项应用于生成的查询。QueryOptions
5 将动态排序应用于查询。 您可以向方法签名添加参数,Spring Data 会自动将排序应用于查询。Sort
6 将动态结果限制应用于查询。 可以使用 来限制查询结果。SELECT … LIMIT
7 演示可以使用在 中注册的实例基于非基元类型的属性进行查询。 如果找到多个匹配项,则进行抛出。ConverterCustomConversionsIncorrectResultSizeDataAccessException
8 使用关键字将查询限制为仅第一个结果。 与前面的方法不同,如果找到多个匹配项,此方法不会引发异常。First
9 使用 Java 8 在迭代流时读取和转换单个元素。Stream
10 显示用 批注的查询方法,以允许服务器端筛选。@AllowFiltering
1 对具有给定 . 查询是通过分析约束的方法名称派生的,约束可以与 和 连接。 因此,方法名称将生成 .firstnameAndOrSELECT * FROM person WHERE firstname = :firstname
2 对具有给定的所有人的查询,一旦从给定的 发出 。firstnamefirstnamePublisher
3 查找给定条件的单个实体。 完成非唯一结果。IncorrectResultSizeDataAccessException
4 与前面的查询不同,即使查询生成更多结果行,也始终发出第一个实体。
5 用 注释的查询方法,允许服务器端筛选。@AllowFiltering
查询非主键属性需要二级索引。
表 1.查询方法支持的关键字
关键词 样本 合乎逻辑的结果

After

findByBirthdateAfter(Date date)

birthdate > date

GreaterThan

findByAgeGreaterThan(int age)

age > age

GreaterThanEqual

findByAgeGreaterThanEqual(int age)

age >= age

Before

findByBirthdateBefore(Date date)

birthdate < date

LessThan

findByAgeLessThan(int age)

age < age

LessThanEqual

findByAgeLessThanEqual(int age)

age ⇐ age

Between

findByAgeBetween(int from, int to)findByAgeBetween(Range<Integer> range)

age > from AND age < to和 下限/上限 ( / & / ) 根据>>=<Range

In

findByAgeIn(Collection ages)

age IN (ages…​)

Like, ,StartingWithEndingWith

findByFirstnameLike(String name)

firstname LIKE (name as like expression)

Containing在字符串上

findByFirstnameContaining(String name)

firstname LIKE (name as like expression)

Containing关于收藏

findByAddressesContaining(Address address)

addresses CONTAINING address

(No keyword)

findByFirstname(String name)

firstname = name

IsTrue,True

findByActiveIsTrue()

active = true

IsFalse,False

findByActiveIsFalse()

active = false

存储库删除查询

上表中的关键字可以结合使用,以创建删除匹配文档的查询。delete…By

  • Imperative

  • Reactive

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

查询选项

您可以通过传递对象来指定查询方法的查询选项。 这些选项适用于实际查询执行之前的查询。 被视为非查询参数,不被视为查询参数值。 查询选项适用于派生存储库方法和字符串存储库方法。QueryOptionsQueryOptions@Query

若要静态设置一致性级别,请使用查询方法的批注。 每次执行查询时,声明的一致性级别都会应用于查询。 以下示例将一致性级别设置为:@ConsistencyConsistencyLevel.LOCAL_ONE

  • Imperative

  • Reactive

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 文档包括对可用一致性级别的良好讨论

您可以通过在 CQL API 实例上配置以下参数来控制提取大小、一致性级别和重试策略默认值:、 和 。 如果未设置特定查询选项,则默认值适用。CqlTemplateAsyncCqlTemplateReactiveCqlTemplate
您可以通过在 CQL API 实例上配置以下参数来控制提取大小、一致性级别和重试策略默认值:、 和 。 如果未设置特定查询选项,则默认值适用。CqlTemplateAsyncCqlTemplateReactiveCqlTemplate