当前位置: 首页 > 知识库问答 >
问题:

使用spring-data-cassandra在cassandra中进行分页和排序

邢卓
2023-03-14

首先,如果任何一个lib spring-data-cassandra的开发人员读到我的话:谢谢你的工作,这个lib就像一个魅力一样工作,并且很好地集成到了spring项目中。

几天前我在尝试使用Cassandra中的分页时遇到了一个问题。我找到了一个解决问题的方法,并将解释我是如何做到这一点的。

我的问题是,我一直在为cassandra使用分页,我不得不迭代结果的片断,直到我决定在分页中使用排序,它才奏效。

为了实现这一点,我使用了:-一个使用扩展CassandraRepository的存储库的服务

下面是代码(包装存储库的服务)

public Slice<Pony> getAllByTypePage(Pageable p, EnumType type) {
        Slice<Pony> slice = ponyRepository.findAllByType(p.first(), type);
        //Iterate over slices
        while(slice.hasNext()&&slice.getPageable().getPageNumber()<p.getPageNumber())
        {
            slice = ponyRepository.findAllByType(slice.nextPageable(), type);   
        }
        return slice;
    }

小马是我的模特

@Repository
public interface PonyRepository extends CassandraRepository<Pony,UUID> {

    @Async
    CompletableFuture<Long> countByType(EnumType type);

    Slice<Pony> findAllByType(Pageable p,EnumType type);
}

然后,知道我做了这个变通方法:

        public Slice<Pony> getAllByTypePage(Pageable p, EnumType type) {
        Slice<Pony> slice = ponyRepository.findAllByType(p.first(), type);
        //using a sidePageable and incrementing it in parallel
        Pageable sidePageable = p.first();
        //Iterate over slices
        while(slice.hasNext()&&sidePageable.getPageNumber()<p.getPageNumber())
        {
            CassandraPageRequest cpr = CassandraPageRequest.of(sidePageable.next(), ((CassandraPageRequest)slice.getPageable()).getPagingState());
            slice = ponyRepository.findAllByType(cpr, type);
            sidePageable=sidePageable.next();
        }
        return slice;
    }

变通办法似乎奏效了。

这种行为是正常的还是bug?

我在jira中没有看到任何关于这方面的问题(也许我没有看到好的地方)。

下面是我使用的相关libs(spring boot 2.2.1/spring code 5.2.1):

spring-data-cassandra:2.2.1.发布cassandra-driver-core:3.7.2

我在spring core 5.1.5上看到过同样的行为

致以最诚挚的问候

共有1个答案

松博耘
2023-03-14

就像在前面的评论中说的,这是一个bug。这个问题已经解决了(请参见前面链接的问题)。

我刚刚尝试了快照2.2.2.build-20191113.121102-4,它似乎有效。

现在我将使用我的变通方法。当库发布时,我会升级。

 类似资料:
  • 有人知道如何在Spring Data Cassandra中实现分页吗? 我已经尝试了所有可能的方法来实现表的分页。其中一个stackoverflow答案说它不是直接提供的。在Spring Boot应用程序中对Cassandra中的SELECT查询结果进行分页 根据文档(https://docs.spring.io/spring-data/cassandra/docs/current-snapsho

  • 1.被动呼叫 回购: 呼叫: 3.获取页面的简单调用。 回购: 启动时出错:

  • 我不明白如何使用Spring Data Cassandra实现非常简单的目标。 我想用不同的参数值多次执行“INSERT”语句。我目前没有映射域类,所以我使用SpringData提供的接口。 当我使用<代码>执行(字符串cql,对象...args),Cassandra驱动程序抱怨“重新准备已经准备好的查询通常是一种反模式,可能会影响性能。考虑只准备一次语句”。因为Spring数据使用< code

  • Spring Data Cassandra 可以大大降低使用 Cassandra 开发的学习曲线。Spring Data Cassandra 既可以和标注的 POJOS 保持在高层次,也可以在低层次维持高性能数据采集能力,它可以符合各种程序的要求。 特性: 基于 Spring Data 界面创建仓库 支持同步和异步数据操作 支持异步回调 支持基于 XML 的密钥空间创建和 CQL 列表创建

  • 启动spring boot application my spring boot application spring boot version 2.2.4和cassandra version spring-data-cassandra 3.0.1时出现此错误

  • 我正在尝试使用cassandra实现分页,但我在Stackoverflow上没有得到任何成功的解决方案。我遇到的突出错误是“对第一个页面以外的页面进行分页查询需要具有有效分页状态的CassandraPageRequest”。请协助。