问题描述
我想创建一个 Spring 数据 jpa 请求,它从 REST API 返回以下结果:
[ {category: “Laptop”,productsAvailable: 2},{category: pc,productsAvailable: 1}]
id | 类别 | 日期 |
---|---|---|
1 | 笔记本电脑 | |
2 | 电脑 | |
3 | 笔记本电脑 |
如何使用单个 sql 请求实现此功能?我可以使用 2 个 sql 查询,但我想使用一个。
解决方法
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
}
]