首先,如果lib spring-data-cassandra的任何开发人员都读过我:谢谢的工作,lib就像一个魅力,并且已经很好地集成到spring项目中。
这里是几天前,我在尝试在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;
}
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:分页状态不匹配,这意味着页面状态的内容已更改,或者您试图将其应用于其他语句
经过一些调试后,我发现我在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; }
解决方法似乎起作用。
这是正常现象还是错误?
我没有在吉拉看到任何与此相关的问题(也许我没有看过这个好地方)。
这是我使用的相关库(spring boot 2.2.1 / spring代码5.2.1):
spring-data-cassandra:2.2.1。发布cassandra-driver-core:3.7.2
我在弹簧芯5.1.5上看到了相同的行为
最佳问候
首先,如果有任何lib开发者spring-data-cassandra读过我的书:谢谢您的工作,该lib的工作就像一个魅力,已经很好地集成到spring项目中。这是几天前,我...
就像前面的评论中所说的,这是一个错误。该问题已得到解决(请参见前面链接的问题)。