java 有没有办法在Sping Boot 中使用React式cassandra repository和Pageable?

mpbci0fu  于 2023-09-29  发布在  Java
关注(0)|答案(1)|浏览(91)

我正在尝试为我的仓库使用ReactiveCassandraRepository接口。当我尝试像这样添加findAll方法时:

public interface MatchRepository extends ReactiveCassandraRepository<Match, UUID> {
    Flux<Match> findAll(Pageable pageable);
}

我收到了这个错误消息:

Error creating bean with name 'matchRepository' defined in MatchRepository defined in 
@EnableReactiveCassandraRepositories declared on CassandraReactiveRepositoriesRegistrar.EnableReactiveCassandraRepositoriesConfiguration: 

Could not create query for public abstract reactor.core.publisher.Flux 
MatchRepository.findAll(org.springframework.data.domain.Pageable); 
Reason: No property 'findAll' found for type 'Match'

如何在Sping Boot 中使用Pageable实现React式cassandra存储库?有相关文件吗?

ovfsdjhp

ovfsdjhp1#

分页和响应

Sping Boot Data Cassandra在reactive中不提供任何分页功能。https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/reactive/package-summary.html

  • 在synchronous中,您等待加载页面并作为结果集返回。
  • 在Asynchronous中,当加载页面时,每个页面都有一个回调。

在这两种情况下,当您用尽结果集时,您都需要进行预加载和下一页获取。
在Reactive中,每个记录都有一个回调/事件作为记录流/流量,因此没有开始也没有结束,页面的概念没有意义。

可能的解决方案

现在要获取一个表中元素的子集,比如100个元素中从15到25个元素,需要一个技巧调用limit(),但是你必须使用Flux<>。您可能需要访问CassandraOperations

int offset=15;
int pageSize=10;
ReactiveResultSet rs = cqlSession.executeReactive(bound);
Flux<ReactiveRow> myPage = Flux.from(rs).skip(offset).take(pageSize);

更多建议

  • 永远不要在Cassandra表中执行findAll()。Cassandra可以存储数十亿条记录。你正在做一个完整的扫描表(非常慢),你可能永远无法在内存中处理。
  • 在Cassandra中,表的设计基于查询/请求模式,并且总是有一个where子句。where子句将确定如何对表进行分区。

相关问题