Reactive Elasticsearch Repositories
Reactive Elasticsearch存储库支持基于由Reactive REST Client执行的、通过Reactive Elasticsearch Operations提供的操作的Repositories中解释的核心存储库支持的基础上构建。 Spring Data Elasticsearch 反应式存储库支持使用 Project Reactor 作为其首选反应式组合库。 有 3 个主要要使用的接口:
-
ReactiveRepository
-
ReactiveCrudRepository
-
ReactiveSortingRepository
Usage
要使用 Repository
访问存储在 Elasticsearch 中的域对象,只需创建一个接口即可。在继续操作之前,需要一个实体。
Example 1. Sample
Person
entitypublic class Person {
@Id
private String id;
private String firstname;
private String lastname;
private Address address;
// … getters and setters omitted
}
请注意, |
Example 2. Basic repository interface to persist Person entities
interface ReactivePersonRepository extends ReactiveSortingRepository<Person, String> {
Flux<Person> findByFirstname(String firstname); 1
Flux<Person> findByFirstname(Publisher<String> firstname); 2
Flux<Person> findByFirstnameOrderByLastname(String firstname); 3
Flux<Person> findByFirstname(String firstname, Sort sort); 4
Flux<Person> findByFirstname(String firstname, Pageable page); 5
Mono<Person> findByFirstnameAndLastname(String firstname, String lastname); 6
Mono<Person> findFirstByLastname(String lastname); 7
@Query("{ \"bool\" : { \"must\" : { \"term\" : { \"lastname\" : \"?0\" } } } }")
Flux<Person> findByLastname(String lastname); 8
Mono<Long> countByFirstname(String firstname) 9
Mono<Boolean> existsByFirstname(String firstname) 10
Mono<Long> deleteByFirstname(String firstname) 11
}
1 | 该方法显示查询所有具有给定 lastname 的人员。 |
2 | Finder 方法等待从 Publisher 输入以绑定 firstname 的参数值。 |
3 | Finder 方法按 lastname 顺序排列匹配的文档。 |
4 | Finder 方法按通过 Sort 参数定义的表达式顺序排列匹配的文档。 |
5 | 使用 Pageable 将偏移量和排序参数传递给数据库。 |
6 | Finder 方法使用 And / Or 关键词连接条件。 |
7 | 查找第一个匹配的实体。 |
8 | 该方法显示查询所有具有给定 lastname 的人员,其通过使用指定的 @Query 和给定的参数查找进行查询。 |
9 | 计算所有具有匹配 firstname 的实体的数量。 |
10 | 检查是否有至少一个具有匹配 firstname 的实体存在。 |
11 | 删除所有具有匹配 firstname 的实体。 |
Configuration
对于 Java 配置,请使用 @EnableReactiveElasticsearchRepositories
注释。如果未配置基本包,该基础会扫描注释的配置类的包。
以下清单展示如何针对仓库使用 Java 配置:
Example 3. Java configuration for repositories
@Configuration
@EnableReactiveElasticsearchRepositories
public class Config extends AbstractReactiveElasticsearchConfiguration {
@Override
public ReactiveElasticsearchClient reactiveElasticsearchClient() {
return ReactiveRestClients.create(ClientConfiguration.localhost());
}
}
因为来自上一个示例的存储库扩展了 ReactiveSortingRepository
,所以除了对实体的分类访问方法外,所有 CRUD 操作都是可用的。使用存储库实例是一个将依赖注入到客户端的问题,如下示例所示:
Example 4. Sorted access to Person entities
public class PersonRepositoryTests {
@Autowired ReactivePersonRepository repository;
@Test
public void sortsElementsCorrectly() {
Flux<Person> persons = repository.findAll(Sort.by(new Order(ASC, "lastname")));
// ...
}
}