gpt4 book ai didi

reactive-programming - 使用动态查询在 ReactiveMongoRepository 上实现分页和排序

转载 作者:行者123 更新时间:2023-12-04 13:15:11 30 4
gpt4 key购买 nike

我知道分页有点违背 react 性原则,但由于要求我必须以某种方式让它工作。我正在使用 Spring Data 2.1.6,但我无法升级所以 ReactiveQuerydslSpecification对于动态查询是不可能的。我想我可以使用 ReactiveMongoTemplate所以我想到了这个:

public interface IPersonRepository extends ReactiveMongoRepository<Person, String>, IPersonFilterRepository {
Flux<Person> findAllByCarId(String carId);
}

public interface IPersonFilterRepository {
Flux<Person> findAllByCarIdAndCreatedDateBetween(String carId, PersonStatus status,
OffsetDateTime from, OffsetDateTime to,
Pageable pageable);
}

@Repository
public class PersonFilterRepository implements IPersonFilterRepository {

@Autowired
private ReactiveMongoTemplate reactiveMongoTemplate;

@Override
public Flux<Person> findAllByCarIdAndCreatedDateBetween(String carId, PersonStatus status,
OffsetDateTime from, OffsetDateTime to,
Pageable pageable) {
Query query = new Query(Criteria.where("carId").is(carId));

if (status != null) {
query.addCriteria(Criteria.where("status").is(status));
}

OffsetDateTime maxLimit = OffsetDateTime.now(ZoneOffset.UTC).minusMonths(3).withDayOfMonth(1); // beginning of month
if (from == null || from.isBefore(maxLimit)) {
from = maxLimit;
}

query.addCriteria(Criteria.where("createdDateTime").gte(from));

if (to == null) {
to = OffsetDateTime.now(ZoneOffset.UTC);
}

query.addCriteria(Criteria.where("createdDateTime").lte(to));

// problem is trying to come up with a decent page-ish behavior compatible with Flux
/*return reactiveMongoTemplate.count(query, Person.class)
.flatMap(count -> reactiveMongoTemplate.find(query, Person.class)
.flatMap(p -> new PageImpl<Person>(p, pageable, count))
.collectList()
.map());*/

/* return reactiveMongoTemplate.find(query, Person.class)
.buffer(pageable.getPageSize(), pageable.getPageNumber() + 1)
//.elementAt(pageable.getPageNumber(), new ArrayList<>())
.thenMany(Flux::from);*/
}

我试图返回一个 Page<Person> (假设一次这个单一方法可能是非 react 性的,一次)并且它在运行测试时失败并出现以下错误(Spring context does not load successfully due to: InvalidDataAccessApiUsageException: 'IDocumentFilterRepository.findAllByCustomerIdAndCreatedDateBetween' must not use sliced or paged execution. Please use Flux.buffer(size, skip) 。我也试过返回 Mono<Page<Person>> 和然后失败 "Method has to use a either multi-item reactive wrapper return type or a wrapped Page/Slice type. Offending method: 'IDocumentFilterRepository.findAllByCustomerIdAndCreatedDateBetween' ,所以我想我唯一的选择是返回一个 Flux ,根据 Example 133, snippet 3

最佳答案

事实证明,您只需将以下内容添加到查询对象即可:

query.with(pageable);

reactiveMongoTemplate.find(query, Person.class);

返回Flux<T>开箱即用。

关于reactive-programming - 使用动态查询在 ReactiveMongoRepository 上实现分页和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61221204/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com