Spring Boot Data REST自定义聚合查询实现方法咨询
实现按厂商分组统计设备数量的API方案
你可以通过Spring Data REST + Spring Data JPA来实现这个需求,不需要额外创建专属实体(也可根据需求选择自定义DTO),以下是几种实用方案:
方案1:Spring Data JPA查询 + 接口投影(最简洁)
无需额外实体类,用接口投影接收统计结果:
- 定义投影接口,匹配查询返回的字段:
public interface ManufacturerCountProjection { String getManufacturer(); Long getCount(); } - 在
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(); } - 启动应用后,Spring Data REST会自动将该方法暴露为搜索端点,访问路径类似:
GET /devices/search/countByManufacturer,返回JSON包含每个厂商的名称及对应设备数量。
方案2:自定义DTO类(更灵活)
如果需要对结果做额外逻辑处理,可定义DTO类:
- 创建带构造函数的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; } } - 修改Repository中的查询语句,实例化DTO:
@Query("SELECT new com.yourpackage.ManufacturerCount(d.manufacturer, COUNT(*)) FROM Device d GROUP BY d.manufacturer") List<ManufacturerCount> countByManufacturer(); - 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
相关产品推荐
相关产品推荐

