You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:57:01