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

时间:2019-11-10 20:44:33

标签: spring-data-cassandra

首先,如果lib的任何开发者spring-data-cassandra读到我:谢谢,您的工作就像lib的魅力一样,并且可以很好地集成到spring项目中。 / p>

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

以下是我的问题,我一直在为卡桑德拉使用分页,并且不得不遍历所有结果,直到我决定在分页中使用Sort为止。

要实现我所使用的: -使用存储库扩展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;
    }

Pony是我的模型en ponyRepository是我的CassandraReposity

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

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

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

当我尝试获取除第一页以外的页面时,出现此异常

com.datastax.driver.core.exceptions.PagingStateException:分页状态不匹配,这意味着分页状态内容已更改,或者您试图将其应用于其他语句 < / p>

经过一些调试后,我发现我在slice.nextPageable()中获得的可分页对象处于Sort.UNSORTED模式,而不是我的输入可分页。

然后,知道我已经解决了这个问题:

        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;
    }

该解决方法似乎有效。

此行为是正常现象还是错误?

我在吉拉(Jira)上没有发现任何有关此问题的信息(也许我没有看过这个好地方)。

这是我使用的相关库(spring boot 2.2.1 / spring代码5.2.1):

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

我在弹簧芯5.1.5上看到了相同的行为

最好的问候

1 个答案:

答案 0 :(得分:0)

就像前面的评论中所说,这是一个错误。 该问题已得到解决(请参见之前链接的问题)。

我刚刚尝试使用快照2.2.2.BUILD-20191113.121102-4,它似乎可以正常工作。

现在,我将使用我的解决方法。 lib发行后,我将进行升级。

感谢@ mp911de的帮助