java - spring cassandra 数据版本 2.1.4 分页

标签 java spring-boot cassandra pagination spring-data-cassandra

根据文档:https://docs.spring.io/spring-data/cassandra/docs/2.1.4.RELEASE/reference/html/#repositories.limit-query-result

Spring cassandra 数据使得获取分页信息变得容易。 但我无法让它工作。

repo 、调用和错误:

<强>1。响应调用

repo :

public interface MyRepository extends ReactiveCassandraRepository<MyClass, String> {
  @Query("select * from my_keyspace.my_table where solr_query = ?0")
  Mono<Slice<MyClass>> findMono(String solrQuery, Pageable page);
}

调用:

 Mono<Slice<MyClass>>  repository.findMono(queryString, CassandraPageRequest.first(20));

错误:

"exceptionDescription":"org.springframework.core.codec.CodecException: Type definition error: [simple type, class com.datastax.driver.core.PagingState]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.datastax.driver.core.PagingState and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: org.springframework.data.domain.SliceImpl[\"pageable\"]->org.springframework.data.cassandra.core.query.CassandraPageRequest[\"pagingState\"])","lines":["org.springframework.http.codec.json.AbstractJackson2Encoder.encodeValue(AbstractJackson2Encoder.java:175)","org.springframework.http.codec.json.AbstractJackson2Encoder.lambda$encode$0(AbstractJackson2Encoder.java:122)","reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:100)","reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:67)","reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:114)","reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onNext(FluxDefaultIfEmpty.java:92)","reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1476)","reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:241)","reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121)","reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1476)","reactor.core.publisher.MonoCollectList$MonoBufferAllSubscriber.onComplete(MonoCollectList.java:118)","reactor.core.publisher.FluxTake$TakeFuseableSubscriber.onComplete(FluxTake.java:424)","reactor.core.publisher.FluxTake$TakeFuseableSubscriber.onNext(FluxTake.java:404)","reactor.core.publisher.FluxIterable$IterableSubscription.fastPath(FluxIterable.java:311)","reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:198)"],

<强>2。与 ReactiveSortingRepository react

repo :

public interface LocationRepository extends ReactiveSortingRepository<MyClass, String> {
}

调用:

 repository.findAll(CassandraPageRequest.first(20))

错误:

Syntax error: findAll can't be applied to CassandraPageRequest.

<强>3。简单调用即可获取页面。

repo :

public interface MyRepository extends CassandraRepository<MyClass, MyClassKey> {
Page<MyClass> findByKeyTerminalIdAndSolrQuery(String solrQuery, Pageable page);
}

启动时出错:

Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Page queries are not supported. Use a Slice query.

<强>4。使用 PagingAndSortingRepository

repo :

public interface MyRepository extends PagingAndSortingRepository<MyClass, MyClassKey> {

}

调用:

   Page<Vessel> vessels = repository.findAll(CassandraPageRequest.first(10));

错误:

springframework.data.mapping.PropertyReferenceException: No property findAll found for type MyClass!

最佳答案

欢迎来到 Stack Overflow。

第一个例子是合适的:

public interface MyRepository extends ReactiveCassandraRepository<MyClass, String> {
  @Query("select * from my_keyspace.my_table where solr_query = ?0")
  Mono<Slice<MyClass>> findMono(String solrQuery, Pageable page);
}

Mono<Slice<MyClass>>  repository.findMono(queryString, CassandraPageRequest.first(20));

问题是 Jackson 无法在您将 SliceImpl(Slice 的实现)传递给 WebFlux 时对其进行编码(根据堆栈跟踪)。因此,查询会产生正确的结果,但如果您想对其进行 JSON 编码,则需要传递 Slice 内容,而不是 Slice 本身。

相关说明:ReactiveCassandraRepository 没有实现 ReactiveSortingRepository 因为 Casandra 查询带有 Sort 参数总是需要 WHERE子句。查看 ReactiveSortingRepository,您会看到一个不采用过滤条件的 findAll(Sort) 方法:

public interface ReactiveSortingRepository<T, ID> extends ReactiveCrudRepository<T, ID> {
    Flux<T> findAll(Sort sort);
}

关于java - spring cassandra 数据版本 2.1.4 分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54789500/

相关文章:

Java 数据存储优化选项

java - Spring Boot找不到该类型的bean

java - spring boot oauth2 feign 允许匿名请求

Cassandra - 数据建模时间序列 - 避免 "Hot Spots"?

clojure - 哪个 Clojure 库用于访问 Cassandra 数据库?

java - 扩展抽象类时出错

java - 默认参数值在 iReport 中有效,但在 JasperServer 中无效

java - 远程调试 Java 应用程序

java - Spring Boot中多字段搜索并实现分页

cassandra - 在cqlsh中禁用颜色