gpt4 book ai didi

java - 使用 Spring Data 中的 CassandraRepository 为 Cassandra 实现分页的正确方法

转载 作者:行者123 更新时间:2023-12-01 14:28:27 24 4
gpt4 key购买 nike

我正在寻找一种解决方案,使用 Cassandra(版本 3.11.3)数据库为基于 Spring Boot 的 REST 服务实现分页。我们正在使用 Spring Boot 2.0.5.RELEASEspring-boot-starter-data-cassandra作为依赖。

作为 Spring Data 的 CassandraRepository<T, ID>接口(interface)不扩展 PagingAndSortingRepository我们没有像 JPA 那样获得完整的分页功能。 .

我阅读了 Spring Data Cassandra 文档,并找到了一种可能的方法来使用 Cassandra 和 Spring Data 作为 CassandraRepository 实现分页。接口(interface)有以下方法可用Slice<T> findAll(Pageable pageable); .我知道 Cassandra 无法获取特定页面,并且总是需要页面零来遍历所有页面,因为它记录在 CassandraPageRequest 中。 :

Cassandra-specific {@link PageRequest} implementation providing access to {@link PagingState}. This class allows creation of the first page request and represents through Cassandra paging is based on the progress of fetched pages and allows forward-only navigation. Accessing a particular page requires fetching of all pages until the desired page is reached.



在我的用例中,我们有 > 1.000.000 个数据库条目,并希望在我们的单页应用程序中分页显示它们。

我目前的方法如下所示:
@RestController
@RequestMapping("/users")
public class UsersResource {

@Autowired
UserRepository userRepository;

@GetMapping
public ResponseEntity<List<User>> getAllTests(
@RequestParam(defaultValue = "0", name = "page") @Positive int requiredPage,
@RequestParam(defaultValue = "500", name = "size") int size) {

Slice<User> resultList = userRepository.findAll(CassandraPageRequest.first(size));

int currentPage = 0;

while (resultList.hasNext() && currentPage <= requiredPage) {
System.out.println("Current Page Number: " + currentPage);
resultList = userRepository.findAll(resultList.nextPageable());
currentPage++;
}

return ResponseEntity.ok(resultList.getContent());
}
}

但是 使用这种方法,我必须找到请求的页面,同时将所有数据库条目提取到内存并迭代,直到找到正确的页面。是否有不同的方法来找到正确的页面,还是我必须使用我当前的解决方案?

我的 Cassandra 表定义如下所示:
CREATE TABLE user (
id int, firstname varchar,
lastname varchar,
code varchar,
PRIMARY KEY(id)
);

最佳答案

我所做的是创建一个具有内容和 pagingState 哈希的页面对象。

在初始页面中,我们有简单的分页
Pageable pageRequest = CassandraPageRequest.of(0,5);
一旦执行了查找,我们就得到了切片
Slice<Group> slice = groupRepository.findAll(pageRequest);
使用切片,您可以获得分页状态
page.setPageHash(getPageHash((CassandraPageRequest) slice.getPageable()));
在哪里
private String getPageHash(CassandraPageRequest pageRequest) {
return Base64.toBase64String(pageRequest.getPagingState().toBytes());
}

最后返回一个带有 List 内容和 pageHash 的 Page 对象

关于java - 使用 Spring Data 中的 CassandraRepository 为 Cassandra 实现分页的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52518914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com