首先,如果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上看到了相同的行为
最好的问候
答案 0 :(得分:0)
我刚刚尝试使用快照2.2.2.BUILD-20191113.121102-4,它似乎可以正常工作。
现在,我将使用我的解决方法。 lib发行后,我将进行升级。
感谢@ mp911de的帮助