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

Spring Boot Data REST自定义聚合查询实现方法咨询

实现按厂商分组统计设备数量的API方案

你可以通过Spring Data REST + Spring Data JPA来实现这个需求,不需要额外创建专属实体(也可根据需求选择自定义DTO),以下是几种实用方案:

方案1:Spring Data JPA查询 + 接口投影(最简洁)

无需额外实体类,用接口投影接收统计结果:

  1. 定义投影接口,匹配查询返回的字段:
    public interface ManufacturerCountProjection {
        String getManufacturer();
        Long getCount();
    }
    
  2. 在DeviceRepository中添加自定义查询方法:
    @RepositoryRestResource(collectionResourceRel = "devices", path = "devices")
    public interface DeviceRepository extends JpaRepository<Device, Long> {
        @Query("SELECT d.manufacturer as manufacturer, COUNT(*) as count FROM Device d GROUP BY d.manufacturer")
        List<ManufacturerCountProjection> countByManufacturer();
    }
    
  3. 启动应用后,Spring Data REST会自动将该方法暴露为搜索端点,访问路径类似:GET /devices/search/countByManufacturer,返回JSON包含每个厂商的名称及对应设备数量。

方案2:自定义DTO类(更灵活)

如果需要对结果做额外逻辑处理,可定义DTO类:

  1. 创建带构造函数的DTO:
    public class ManufacturerCount {
        private String manufacturer;
        private Long count;
    
        public ManufacturerCount(String manufacturer, Long count) {
            this.manufacturer = manufacturer;
            this.count = count;
        }
    
        // Getter方法
        public String getManufacturer() { return manufacturer; }
        public Long getCount() { return count; }
    }
    
  2. 修改Repository中的查询语句,实例化DTO:
    @Query("SELECT new com.yourpackage.ManufacturerCount(d.manufacturer, COUNT(*)) FROM Device d GROUP BY d.manufacturer")
    List<ManufacturerCount> countByManufacturer();
    
  3. Spring Data REST同样会自动暴露该搜索端点,返回结构清晰的DTO数据。

方案3:自定义REST控制器(完全控制端点)

若不想依赖Spring Data REST的自动暴露规则,可自行编写控制器:

@RestController
@RequestMapping("/api/manufacturers")
public class ManufacturerStatsController {
    private final DeviceRepository deviceRepository;

    public ManufacturerStatsController(DeviceRepository deviceRepository) {
        this.deviceRepository = deviceRepository;
    }

    @GetMapping("/count")
    public List<ManufacturerCountProjection> getManufacturerCounts() {
        return deviceRepository.countByManufacturer();
    }
}

此时可通过GET /api/manufacturers/count访问统计结果,完全自定义路径和返回逻辑。


内容的提问来源于stack exchange,提问作者Roberto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:40:33