微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用单个查询计算类别

如何解决使用单个查询计算类别

我想创建一个 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
   }
]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。