You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将获取各product_id最新价格行的SQL转换为Spring Data适配的HQL?

把高效的最新价格查询SQL转换为HQL(适配Spring Data)

嘿,先帮你纠正下原SQL里的小问题:你子查询里同时选了p2.id和max(p2.date),但GROUP BY只指定了product_id,这在大多数数据库里是不合法的——因为id既不是聚合函数的结果,也不在分组字段里,数据库无法确定要返回哪个id。正确的子查询应该只保留product_id和对应的最新日期,之后再通过这两个字段关联主表拿到完整行。

修正后的SQL(先确保逻辑正确)

SELECT p1.* 
FROM price p1
JOIN (
    SELECT p2.product_id, MAX(p2.date) AS max_date 
    FROM price p2 
    GROUP BY p2.product_id
) p2 ON p1.product_id = p2.product_id AND p1.date = p2.max_date

转换为HQL(适配Spring Data JPA)

假设你的实体类名为Price,属性对应表字段(比如productId对应product_id,date对应date),对应的HQL写法如下:

SELECT p1 
FROM Price p1
JOIN (
    SELECT p2.productId, MAX(p2.date) AS maxDate 
    FROM Price p2 
    GROUP BY p2.productId
) p2 ON p1.productId = p2.productId AND p1.date = p2.maxDate

注意事项

  • HQL是面向实体的,所以要使用实体类名称(比如Price,注意大小写和你定义的一致),而不是数据库表名;
  • 使用实体类的属性名(比如productId)而不是数据库列名(product_id);
  • 如果你的Price实体中productId是关联的Product实体对象(而非基本类型),那子查询里要改成p2.product.id,关联条件也对应调整为p1.product.id = p2.productId;
  • 在Spring Data中,你可以把这段HQL放在@Query注解里,比如:
    @Query("SELECT p1 FROM Price p1 JOIN (SELECT p2.productId, MAX(p2.date) AS maxDate FROM Price p2 GROUP BY p2.productId) p2 ON p1.productId = p2.productId AND p1.date = p2.maxDate")
    List<Price> findLatestPricePerProduct();
    

内容的提问来源于stack exchange,提问作者Eduardo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:00:07