Spring WebFlux中通过R2dbc Repository返回自定义分组查询结果列表的方法
实现方案
步骤1:定义结果映射DTO
你现有的Sales实体没有销售数量对应的字段,直接用Sales接收分组查询结果会出现字段不匹配的问题,所以需要单独定义一个DTO类来接收返回结果:
// Java 16+ 可以直接用record简化代码,无需手动编写getter/setter public record SalesByContractTypeDTO( Long salesnumbers, TypeContract typecontract ) {}
如果使用的Java版本低于16,改用普通POJO即可:
public class SalesByContractTypeDTO { private Long salesnumbers; private TypeContract typecontract; // 必须保留无参构造、全参构造、getter、setter,供R2dbc反射映射字段 public SalesByContractTypeDTO() {} public SalesByContractTypeDTO(Long salesnumbers, TypeContract typecontract) { this.salesnumbers = salesnumbers; this.typecontract = typecontract; } public Long getSalesnumbers() { return salesnumbers; } public void setSalesnumbers(Long salesnumbers) { this.salesnumbers = salesnumbers; } public TypeContract getTypecontract() { return typecontract; } public void setTypecontract(TypeContract typecontract) { this.typecontract = typecontract; } }
步骤2:编写R2dbc Repository查询方法
在你的SalesRepository接口中添加对应的查询方法,返回类型指定为Flux<SalesByContractTypeDTO>,你写的查询语句已经正确配置了字段别名,和DTO属性名完全匹配,直接使用即可:
public interface SalesRepository extends ReactiveCrudRepository<Sales, Long> { @Query("SELECT COUNT(sales.id)as salesnumbers, sales.type_contract as typecontract FROM sales GROUP BY sales.type_contract") Flux<SalesByContractTypeDTO> countSalesByContractType(); }
步骤3:调用方法获取结果
在业务层注入Repository调用对应方法就能拿到各合同类型对应的销售数量列表:
@Service public class SalesService { private final SalesRepository salesRepository; public SalesService(SalesRepository salesRepository) { this.salesRepository = salesRepository; } public Flux<SalesByContractTypeDTO> getSalesCountGroupByContractType() { return salesRepository.countSalesByContractType(); } }
注意事项
- 查询语句的字段别名必须和DTO属性名完全一致,否则R2dbc映射时对应字段会返回null
- 如果
TypeContract枚举映射异常,可以检查数据库type_contract字段存储格式和枚举序列化规则是否匹配,默认R2dbc支持枚举的ORDINAL、NAME两种映射格式
内容的提问来源于stack exchange,提问作者Joji
相关产品推荐
相关产品推荐

