我正在使用新的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:
是否可以在该模块上使用分页?
答案 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
完整的代码示例,请选中here,test 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);
}