|
此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Data Cassandra 4.5.2! |
特定于 Cassandra 的查询方法
| 本章介绍特定于 Cassandra 的查询方法。 本文档使用命令式类型。 通过使用响应式返回类型,相同的语义也适用于响应式存储库。 |
您通常在存储库上触发的大多数数据访问作都会导致对 Apache Cassandra 数据库执行查询。 定义这样的查询是在存储库接口上声明一个方法的问题。 以下示例显示了许多此类方法声明:
-
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 | 该方法显示对具有给定lastname.
查询派生自解析约束的方法名称,约束可以与And.
因此,方法名称会导致查询表达式SELECT * FROM person WHERE lastname = 'lastname'. |
| 2 | 将分页应用于查询。
您可以在方法签名中配备Pageable参数,并让该方法返回一个Slice实例,我们会自动相应地分页查询。 |
| 3 | 将滚动应用于查询。
滚动包装 Cassandra 的PagingState到CassandraScrollPosition并允许动态限制。
您还可以使用findTop…对于静态限制。 |
| 4 | 传递一个QueryOptions对象在执行之前将查询选项应用于生成的查询。 |
| 5 | 将动态排序应用于查询。
您可以添加一个Sort参数添加到您的方法签名中,Spring Data 会自动将排序应用于查询。 |
| 6 | 将动态结果限制应用于查询。
可以使用SELECT … LIMIT. |
| 7 | 显示可以使用Converter在CustomConversions.
抛出IncorrectResultSizeDataAccessException如果找到多个匹配项。 |
| 8 | 使用First关键字将查询限制为仅第一个结果。
与前面的方法不同,如果找到多个匹配项,则此方法不会引发异常。 |
| 9 | 使用 Java 8Stream在迭代流时读取和转换单个元素。 |
| 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.
查询是通过解析约束的方法名称派生的,约束可以与And和Or.
因此,方法名称会导致查询表达式SELECT * FROM person WHERE firstname = :firstname. |
| 2 | 对所有具有给定firstname一旦firstname从给定的Publisher. |
| 3 | 为给定条件查找单个实体。
完成IncorrectResultSizeDataAccessException在非唯一结果上。 |
| 4 | 与前面的查询不同,即使查询产生更多结果行,也始终发出第一个实体。 |
| 5 | 用@AllowFiltering,这允许服务器端过滤。 |
| 查询非主键属性需要辅助索引。 |
下表显示了可在查询方法中使用的关键字的简短示例:
| 关键词 | 样本 | 逻辑结果 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
存储库删除查询
上表中的关键字可以与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.
查询选项
您可以通过将QueryOptions对象。
这些选项适用于实际查询执行之前的查询。QueryOptions被视为非查询参数,不被视为查询参数值。
查询选项适用于派生和字符串@Query存储库方法。
要静态设置一致性级别,请使用@Consistency查询方法上的注释。
每次执行查询时,声明的一致性级别都会应用于查询。
以下示例将一致性级别设置为ConsistencyLevel.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 实例上配置以下参数来控制获取大小、一致性级别和重试策略默认值:CqlTemplate,AsyncCqlTemplate和ReactiveCqlTemplate.
如果未设置特定查询选项,则默认值适用。 |