使用单个查询计算类别
Count categories with single query
我想创建一个 Spring 数据 jpa 请求,returns 来自 REST API 的以下结果:
[ {category: “Laptop”, productsAvailable: 2}, {category: pc,
productsAvailable: 1}]
id
category
date
1
laptop
2
pc
3
laptop
如何通过单个 SQL 请求实现此目的?我可以使用 2 个 SQL 个查询来实现,但我想使用一个。
JPA 规范允许我们自定义面向对象的结果。您可以使用 JPQL 构造函数表达式来设置结果:
public interface ProductRepository extends JpaRepository<Product, Long> {
@Query("SELECT new com.Whosebug.TotalProductDTO(p.category, COUNT(p.category)) FROM Product AS p GROUP BY p.category")
List<TotalProductDTO> countTotalProductsByCategory();
}
这会将 SELECT
语句的输出绑定到 POJO
。指定的 class 需要有一个与投影属性完全匹配的构造函数:
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
}
]
我想创建一个 Spring 数据 jpa 请求,returns 来自 REST API 的以下结果:
[ {category: “Laptop”, productsAvailable: 2}, {category: pc,
productsAvailable: 1}]
id | category | date |
---|---|---|
1 | laptop | |
2 | pc | |
3 | laptop |
如何通过单个 SQL 请求实现此目的?我可以使用 2 个 SQL 个查询来实现,但我想使用一个。
JPA 规范允许我们自定义面向对象的结果。您可以使用 JPQL 构造函数表达式来设置结果:
public interface ProductRepository extends JpaRepository<Product, Long> {
@Query("SELECT new com.Whosebug.TotalProductDTO(p.category, COUNT(p.category)) FROM Product AS p GROUP BY p.category")
List<TotalProductDTO> countTotalProductsByCategory();
}
这会将 SELECT
语句的输出绑定到 POJO
。指定的 class 需要有一个与投影属性完全匹配的构造函数:
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
}
]