对于最新的稳定版本,请使用 Spring Data Cassandra 4.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Data Cassandra 4.3.1Spring中文文档

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

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

具有查询方法的 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 该方法显示对具有给定 . 查询是从分析约束的方法名称派生的,该约束可以与 连接。 因此,方法名称将生成 .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
查询非主键属性需要二级索引。

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

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

AfterSpring中文文档

findByBirthdateAfter(Date date)Spring中文文档

birthdate > dateSpring中文文档

GreaterThanSpring中文文档

findByAgeGreaterThan(int age)Spring中文文档

age > ageSpring中文文档

GreaterThanEqualSpring中文文档

findByAgeGreaterThanEqual(int age)Spring中文文档

age >= ageSpring中文文档

BeforeSpring中文文档

findByBirthdateBefore(Date date)Spring中文文档

birthdate < dateSpring中文文档

LessThanSpring中文文档

findByAgeLessThan(int age)Spring中文文档

age < ageSpring中文文档

LessThanEqualSpring中文文档

findByAgeLessThanEqual(int age)Spring中文文档

age ⇐ ageSpring中文文档

BetweenSpring中文文档

findByAgeBetween(int from, int to)findByAgeBetween(Range<Integer> range)Spring中文文档

age > from AND age < to和 下限/上限 ( / & / ) 根据>>=<RangeSpring中文文档

InSpring中文文档

findByAgeIn(Collection ages)Spring中文文档

age IN (ages…​)Spring中文文档

Like, ,StartingWithEndingWithSpring中文文档

findByFirstnameLike(String name)Spring中文文档

firstname LIKE (name as like expression)Spring中文文档

Containing在字符串上Spring中文文档

findByFirstnameContaining(String name)Spring中文文档

firstname LIKE (name as like expression)Spring中文文档

Containing关于收藏Spring中文文档

findByAddressesContaining(Address address)Spring中文文档

addresses CONTAINING addressSpring中文文档

(No keyword)Spring中文文档

findByFirstname(String name)Spring中文文档

firstname = nameSpring中文文档

IsTrue,TrueSpring中文文档

findByActiveIsTrue()Spring中文文档

active = trueSpring中文文档

IsFalse,FalseSpring中文文档

findByActiveIsFalse()Spring中文文档

active = falseSpring中文文档

本章介绍特定于 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.查询方法支持的关键字
关键词 样本 合乎逻辑的结果

AfterSpring中文文档

findByBirthdateAfter(Date date)Spring中文文档

birthdate > dateSpring中文文档

GreaterThanSpring中文文档

findByAgeGreaterThan(int age)Spring中文文档

age > ageSpring中文文档

GreaterThanEqualSpring中文文档

findByAgeGreaterThanEqual(int age)Spring中文文档

age >= ageSpring中文文档

BeforeSpring中文文档

findByBirthdateBefore(Date date)Spring中文文档

birthdate < dateSpring中文文档

LessThanSpring中文文档

findByAgeLessThan(int age)Spring中文文档

age < ageSpring中文文档

LessThanEqualSpring中文文档

findByAgeLessThanEqual(int age)Spring中文文档

age ⇐ ageSpring中文文档

BetweenSpring中文文档

findByAgeBetween(int from, int to)findByAgeBetween(Range<Integer> range)Spring中文文档

age > from AND age < to和 下限/上限 ( / & / ) 根据>>=<RangeSpring中文文档

InSpring中文文档

findByAgeIn(Collection ages)Spring中文文档

age IN (ages…​)Spring中文文档

Like, ,StartingWithEndingWithSpring中文文档

findByFirstnameLike(String name)Spring中文文档

firstname LIKE (name as like expression)Spring中文文档

Containing在字符串上Spring中文文档

findByFirstnameContaining(String name)Spring中文文档

firstname LIKE (name as like expression)Spring中文文档

Containing关于收藏Spring中文文档

findByAddressesContaining(Address address)Spring中文文档

addresses CONTAINING addressSpring中文文档

(No keyword)Spring中文文档

findByFirstname(String name)Spring中文文档

firstname = nameSpring中文文档

IsTrue,TrueSpring中文文档

findByActiveIsTrue()Spring中文文档

active = trueSpring中文文档

IsFalse,FalseSpring中文文档

findByActiveIsFalse()Spring中文文档

active = falseSpring中文文档

存储库删除查询

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

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);
}

删除查询返回查询是否已应用或终止,而不返回值。voidSpring中文文档

查询选项

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

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

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