春季数据r2dbc和分页

时间:2019-11-15 10:16:33

标签: spring-data-r2dbc

我正在使用新的spring data r2dbc模块,并且能够使用ReactiveCrudRepository提取数据。 现在我需要引入分页,但是我无法做到这一点。 我尝试过了

public interface TestRepository extends ReactiveCrudRepository<MyEntity, Long> {
    Flux<MyEntity> findByEntityId(Long entityId, Pageable page);
}

但是当我尝试执行此操作时,出现此错误

org.springframework.data.repository.query.ParameterOutOfBoundsException: Invalid parameter index! You seem to have declared too little query method parameters!
    at org.springframework.data.repository.query.Parameters.getParameter(Parameters.java:237)
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 

是否可以在该模块上使用分页?

4 个答案:

答案 0 :(得分:3)

新的$ ./bin/arrayVLAtoVector How Many Values Do You Wish To Enter For A: 4 Enter Values For A[0]: 10 Enter Values For A[1]: 20 Enter Values For A[2]: thirty error: invalid integer input. Enter Values For A[2]: 30 Enter Values For A[3]: 40 How Many Values Do You Wish To Enter For B: 3 Enter Values For B[0]: 1 Enter Values For B[1]: 2 Enter Values For B[2]: buckle my shoe error: invalid integer input. Enter Values For B[2]: 3 array A: 10 20 30 40 array B: 1 2 3 Spring Data R2dbc 1.2包含这样的分页操作。

R2dbcEntityTemplate

Spring Data R2dbc 1.2(尚未发布)将接受 private final R2dbcEntityTemplate template; public Flux<Post> findByTitleContains(String name) { return this.template.select(Post.class) .matching(Query.query(where("title").like("%" + name + "%")).limit(10).offset(0)) .all(); } 中的Pageable参数。

Repository

完整的代码示例,请选中heretest codes

答案 1 :(得分:0)

否,当前无法使用隐式分页。您应该指定整个查询才能使用它。

这里是一个例子:

@Query("SELECT * FROM my_entity WHERE entity_id = :entityId OFFSET :offset LIMIT :limit")
Flux<MyEntity> findByEntityId(Long entityId, int offset, int limit);

答案 2 :(得分:0)

我能够使用 spring-boot-starter-data-r2dbc.2.4.3 实现这一点

正如@Hantsy 所说,ReactiveCrudRepository 将接受 Pageable 作为查询内部的参数,但这不会解决分页问题。在休眠中,您希望返回一个对象的页面,但对于 Reactive,它将是一个 Flux。

不过,我可以通过使用 PageImpl 类和 ReactiveCrudRepository 接口中的 count 方法来实现这一点。

例如

public interface TestRepository extends ReactiveCrudRepository<MyEntity, Long> {
    Flux<MyEntity> findByEntityId(Long entityId, Pageable page);
}
public Mono<<Page<MyEntity>> getMyEntities(Long entityId, PageRequest request) {
    return testRepository.findByEntityId(entityId, request)
            .collectList()
            .zipWith(testRepository.count())
            .flatMap(entityTuples -> 
                new PageImpl<>(entityTuples.getT1(), request, entityTuples.getT2()));
}

答案 3 :(得分:0)

Spring Data R2dbc 的较新版本接受 @Hantsy 提到的 Pageable,但有一个问题。

如果您在没有任何 WHERE 子句的情况下获取所有记录,则以下操作无效:

public interface MyEntityRepository extends ReactiveCrudRepository<MyEntity, Long> {
    Flux<MyEntity> findAll(Pageable pageable);
}

findAll() 更改为 findBy() 工作正常。

public interface MyEntityRepository extends ReactiveCrudRepository<MyEntity, Long> {
    Flux<MyEntity> findBy(Pageable pageable);
}