JPA 规范允许我们以面向对象的方式自定义结果。您可以使用 JPQL 构造函数表达式来设置结果:
public interface ProductRepository extends JpaRepository<Product, Long> {
@Query("SELECT new com.stackoverflow.TotalProductDTO(p.category, COUNT(p.category)) FROM Product AS p GROUP BY p.category")
List<TotalProductDTO> countTotalProductsByCategory();
}
这会将SELECT 语句的输出绑定到POJO。指定的类需要有一个与投影属性完全匹配的构造函数:
public class TotalProductDTO {
private String category;
private Long productsAvailable;
public TotalProductDTO(String category, Long productsAvailable) {
this.category = category;
this.productsAvailable = productsAvailable;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public Long getProductsAvailable() {
return productsAvailable;
}
public void setProductsAvailable(Long productsAvailable) {
this.productsAvailable = productsAvailable;
}
}
您可以使用如下方法查看所需的 Json 输出。
@RestController
public class ProductController {
private final ProductRepository productRepository;
public ProductController(ProductRepository productRepository) {
this.productRepository = productRepository;
}
@GetMapping(value = {"/availableProducts"})
public ResponseEntity<?> availableProducts() {
List<TotalProductDTO> totalProducts = productRepository.countTotalProductsByCategory();
return ResponseEntity.ok(totalProducts);
}
}
结果你会得到这个json:
[
{
"category":"laptop",
"productsAvailable":2
},
{
"category":"pc",
"productsAvailable":1
}
]