如何通过 Sum SQL 与 Spring Data JPA 一起使用组?

Posted

技术标签:

【中文标题】如何通过 Sum SQL 与 Spring Data JPA 一起使用组?【英文标题】:How to use a group by Sum SQL with Spring Data JPA? 【发布时间】:2015-02-14 03:12:02 【问题描述】:

我想按数量加载畅销产品。这些是我的桌子:

Product
id  name
1    AA   
2    BB

Productorder
order_id  product_id  quantity
1          1          10      
2          1          100    
3          2          15     
4          1          15       

这是我的 Spring 数据存储库:

@Repository
public interface ProductRepository extends JpaRepository<Product, Long> 

    @Query(value = "select top 5 p.name, sum(po.quantity) as total_quantity from product p " +
            "inner join productorder po " +
                "on p.id = po.product_id " +
            "group by p.id, p.name " +
            "order by total_quantity desc", nativeQuery = true)
    List<Product> findTopFiveBestSeller();

我收到 HsqlException: Column not found: id

我认为这个错误与 id 列没有任何关系,因为这两个表都存在。 “按总和查询分组”是否适用于 Spring 数据?因为对我来说这似乎并不奇怪,因为 Spring Data 应该只从数据库中选择产品属性,并且使用这个 sql,我们还选择了 sum(po.quantity)。 Spring数据可以处理这个并将结果转换为List吗?

PS:我使用 HSQLDB 作为 DB 嵌入。

【问题讨论】:

返回名称和总和的查询如何神奇地返回 List,因为 Product 具有 ID 和名称?您的查询不返回产品,因此返回类型不应为 List 错误可能来自 group by,您尝试按 p.id 分组,但它不在您的选择列表中。 Spring 有 DomainClassConverter,它从 ids 具体的 Objects 转换而来。至少我是这么想的。现在我把它改成了“选择前 5 个 p.*”,它可以工作了……谢谢!但“选择前 5 个 p.id”不起作用。 我在解决方案中添加了解释,因为找出两个查询之间的差异并非易事。 【参考方案1】:

将 select 语句投影从 p.name 更改为 p.* 以表明我选择了多个值,而不仅仅是必须神奇地转换为 Product 对象的 String 对象,这样就可以了:

@Repository
public interface ProductRepository extends JpaRepository<Product, Long> 

    @Query(value = "select top 5 p.*, sum(po.quantity) as total_quantity from product p " +
        "inner join productorder po " +
            "on p.id = po.product_id " +
        "group by p.id, p.name " +
        "order by total_quantity desc", nativeQuery = true)
    List<Product> findTopFiveBestSeller();


感谢@JMK 和@JB Nizet。

【讨论】:

嗨,您是否在 Product bean 中创建了 total_quantity 列?我需要做类似的事情..你能详细说明你在 bean 级别中的内容吗? 他可以通过创建外部pojo类来使用数量 @TanvirChowdhury 我发现你至少必须映射 SUM 表达式中使用的列,在这种情况下,“数量”我也不会在这种情况下返回存储库对象。返回 List 时它对我有用,每个对象代表一列。 我们可以使用标准来达到同样的效果吗

以上是关于如何通过 Sum SQL 与 Spring Data JPA 一起使用组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中将 CASE 表达式与 SUM 函数一起使用?

如何通过ajax从spring控制器获取数据?

T-SQL-Sum over Partition by 与 group by 组合

新面试题

SQL开发实战技巧系列(十三):讨论一下常用聚集函数&通过执行计划看sum()over()对员工工资进行累加

如何更改 dat.gui 下拉菜单的位置?