Spring 数据反应存储库 - r2dbc 不工作

Spring data reactive repository - r2dbc not working

正在执行查询,但没有得到任何结果。

router :- api/v1/service/appt/usr/{usr_id}

private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

public Mono<ServerResponse> retrieveProjectsByUsr(ServerRequest request) {
        final String userIdStr = request.pathVariable(USER_ID_PARAM);
        final Optional<String> stDateStr = request.queryParam("stDate");
        final Optional<String> endDateStr = request.queryParam("endDate");

        final LocalDateTime stDate = LocalDateTime.parse(stDateStr.get(), DATE_TIME_FORMATTER);
        final LocalDateTime endDate = LocalDateTime.parse(endDateStr.get(), DATE_TIME_FORMATTER);
        long userId = Long.parseLong(userIdStr);

        return secContext.retrieveUser().flatMap(usr -> {
            Flux<Appt> appts = projectRepository.findApptsBetween(stDate, endDate, userId, usr.getOrgId());
            return ServerResponse.ok().contentType(APPLICATION_JSON).body(appts, Project.class);
        });
    }

仓库代码,

@Repository
public interface ApptRepository extends ReactiveCrudRepository<Appt, Long> {
    
    @Query("select * from appt where usr_id = :usrId and org_id = :orgId and start_time BETWEEN :stDate and :endDate")
    Flux<Appt> findApptsBetween(LocalDateTime stDate, LocalDateTime endDate, long usrId, int orgId);

}

从日志查询,

Executing SQL statement [select * from appt where usr_id = :usrId and org_id = :orgId and start_time BETWEEN :stDate and :endDate]

项目中的数据table、

邮递员请求,

http://localhost:9090/api/v1/service/appt/usr/2?stDate=2021-01-24 03:20&endDate=2021-03-25 05:23

不确定这有什么问题。它没有 return 记录。

这里的问题是需要订阅响应式代码才能开始执行。以下语句仅描述了应该发生的情况:

Flux<Appt> appts = projectRepository.findApptsBetween(stDate, endDate, userId, usr.getOrgId());

要启动执行,需要将 .subscribe() 运算符添加到反应式调用中。但在这里你不希望那样,因为那将在不同的 context/thread 中开始执行,你将无法 return 外部方法的值。这就是为什么应该将反应式代码编写为反应式调用链的原因。 (注意:控制器方法和路由器函数在代码末尾有一个隐式 .subscribe(),因此您不需要添加它)

您可以将这段代码改写成这样:

return secContext.retrieveUser().flatMap(usr -> 
        projectRepository.findApptsBetween(stDate, endDate, userId, usr.getOrgId())
         .collectList()
         .map(appts -> ServerResponse.ok().contentType(APPLICATION_JSON).body(appts, Project.class));
        

以下代码有效。答案是从上面的帖子修改的。

return secContext.retrieveUser()
                .flatMap(usr -> apptRepository.findApptsBetween(userId, usr.getOrgId(), stDate, endDate).collectList()
                        .flatMap(appts -> ServerResponse.ok().contentType(APPLICATION_JSON).bodyValue(appts)));