9

我正在使用新的 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

4 回答 4

8

新的R2dbcEntityTemplateSpring 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();
    }

PageableSpring Data R2dbc 1.2(尚未发布)将接受Repository.

 public Flux<PostSummary> findByTitleLike(String title, Pageable pageable);

完整的代码示例,请查看此处测试代码

于 2020-09-08T04:16:35.813 回答
3

不,目前没有办法使用隐式分页。您应该指定整个查询以使用它。

这是一个例子:

@Query("SELECT * FROM my_entity WHERE entity_id = :entityId OFFSET :offset LIMIT :limit")
Flux<MyEntity> findByEntityId(Long entityId, int offset, int limit);
于 2019-11-20T08:46:28.257 回答
1

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);
}
于 2021-04-15T12:42:04.853 回答
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()));
}
于 2021-04-01T15:00:15.187 回答