|
对于最新的稳定版本,请使用 Spring Data Cassandra 5.0.4! |
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 | 对查询应用滚动(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 的人员。
该查询通过解析方法名中的约束条件生成,这些约束条件可以用 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)上配置以下参数,来控制获取大小(fetch size)、一致性级别(consistency level)和重试策略(retry policy)的默认值。
如果未设置特定的查询选项,则会应用这些默认值。 |