如何将JPA Criteria API代码改造为响应式实现并返回Mono<List<QdCF>>
迁移JPA Criteria查询到Spring Data R2DBC响应式实现
首先要明确:JPA是阻塞式API,无法直接改造为响应式实现。你已经引入了spring-boot-starter-data-r2dbc,应该基于R2DBC来实现响应式查询,同时建议移除spring-boot-starter-data-jpa依赖(避免冲突,且JPA无法提供真正的响应式能力)。
下面提供两种可行的改造方案,都能返回Mono<List<QdCF>>类型结果:
方案一:使用Spring Data R2DBC派生查询(推荐,最简单)
对于findByDataBaixaNull这种简单的固定条件查询,Spring Data R2DBC支持通过方法名自动生成查询,无需手动写Criteria:
import org.springframework.data.repository.reactive.ReactiveCrudRepository; import reactor.core.publisher.Mono; import java.util.List; public interface QdCFReactiveRepository extends ReactiveCrudRepository<QdCF, Long> { // 方法名遵循Spring Data命名规则,自动生成"data_baixa IS NULL"的查询 Mono<List<QdCF>> findByDataBaixaIsNull(); }
直接注入这个接口调用即可,Spring Data会自动完成响应式查询的实现。
方案二:手动构建动态查询(类似JPA Criteria的场景)
如果需要动态拼接查询条件(对应原来JPA Criteria的灵活场景),可以用Spring Data R2DBC提供的Criteria API结合DatabaseClient来实现:
import org.springframework.data.r2dbc.core.DatabaseClient; import org.springframework.data.r2dbc.core.query.Criteria; import org.springframework.stereotype.Repository; import reactor.core.publisher.Mono; import java.util.List; @Repository public class QdCFR2dbcCustomRepository { private final DatabaseClient databaseClient; // 构造注入DatabaseClient public QdCFR2dbcCustomRepository(DatabaseClient databaseClient) { this.databaseClient = databaseClient; } public Mono<List<QdCF>> findByDataBaixaNull() { return databaseClient.select() .from(QdCF.class) // 构建查询条件:dataBaixa为null .matching(Criteria.where("dataBaixa").isNull()) .fetch() .all() // 以Flux<QdCF>返回所有结果 .collectList(); // 转换为Mono<List<QdCF>> } }
关键注意点
- 不要同时混用JPA和R2DBC的Repository:JPA的Repository是阻塞的,会破坏WebFlux的响应式链路。
- 确保实体类
QdCF适配R2DBC:比如用@Table注解(Spring Data R2DBC的注解,而非JPA的@Entity),字段映射正确。
内容的提问来源于stack exchange,提问作者Jordi
相关产品推荐
相关产品推荐

