关于如何获得组合结果的第一部分。我会做这样的事情。
- 按照您编写的方式创建存储库接口,但使用 spring data jpa 而不是原始查询
- 每个方法调用的用户 CompletableFuture
- 将结果组合成一个 dto
- 返回这个组合结果
@Repository
public interface SampleDocumentRepository extends JpaRepository<SampleDocument, Integer> {
Page<SampleDocument> findByNameContains(String name, Pageable pageable);
Page<SampleDocument> findByNumberContains(String number, Pageable pageable);
Page<SampleDocument> findByProjectContains(String project, Pageable pageable);
}
结果组合在一起的服务类
@Service
@AllArgsConstructor
public class SampleDocumentService {
private final SampleDocumentRepository repository;
@Transactional(readOnly = true)
public CompletableFuture<ResultDto> search(String query) {
PageRequest page = PageRequest.of(0, 20);
CompletableFuture<Page<SampleDocument>> nameSearch = CompletableFuture.supplyAsync(() -> repository.findByNameContains(query, page));
CompletableFuture<Page<SampleDocument>> numberSearch = CompletableFuture.supplyAsync(() -> repository.findByNumberContains(query, page));
CompletableFuture<Page<SampleDocument>> projectSearch = CompletableFuture.supplyAsync(() -> repository.findByProjectContains(query, page));
return CompletableFuture.allOf(nameSearch, numberSearch, projectSearch)
.thenApply(unused -> new ResultDto(nameSearch.join(), numberSearch.join(), projectSearch.join()));
}
}
然后是来自服务的调用
@GetMapping("/search")
public CompletableFuture<ResultDto> search(@RequestParam("query") String query) {
return service.search(query);
}
使用您的查询参数调用
http://localhost:8080/sample/search?query=hello
回答第二部分,如果您想检查查询是否存在于任何列中,您可以编写 JPA 查询结合 Or 运算符,如下所示。
Page<SampleDocument> findByNameContainsOrNumberContainsOrProjectContains(String name, String number, String project, Pageable pageable);
调用者会是这样的
@Transactional(readOnly = true)
public CompletableFuture<ResultDto> searchAll(String query) {
PageRequest page = PageRequest.of(0, 20);
CompletableFuture<Page<SampleDocument>> nameSearch = CompletableFuture.supplyAsync(() ->
repository.findByNameContainsOrNumberContainsOrProjectContains(query, query, query, page));
return CompletableFuture.allOf(nameSearch)
.thenApply(unused -> new ResultDto(nameSearch.join(), null, null));
}
如果您想将 Async 与 Spring Data 和 Completable 一起使用,请关注此link