从 table 中获取最新一列,按 HQL 中的另一列分组

Get latest of a column from table, grouped by another column in HQL

我费了好大的劲才想出 HQL 语句。我正在尝试获取一组中所有产品订单的最新状态,但似乎无法找出正确的 HQL 语法来使其正常工作...

示例table:

id | created_at | group_id | purchase_id | status
---|------------|----------|-------------|------------
0  | 10         | 3        | 6           | DELIVERING
1  | 11         | 3        | 6           | DELIVERED
2  | 12         | 3        | 7           | DELIVERING
3  | 13         | 3        | 8           | DELIVERING
4  | 14         | 4        | 13          | DELIVERING
5  | 15         | 4        | 13          | DELIVERED
6  | 16         | 4        | 13          | LOST
7  | 17         | 5        | 17          | DELIVERING

获取每个 purchase_id 的最新(按 created_at),其中 group_id = 3。应该导致此 table:

id | created_at | group_id | purchase_id | status
---|------------|----------|-------------|------------
1  | 11         | 3        | 6           | DELIVERED
2  | 12         | 3        | 7           | DELIVERING
3  | 13         | 3        | 8           | DELIVERING

在 PostgreSQL 中有效的查询:

SELECT DISTINCT ON (o.purchase_id) *
FROM orders o
WHERE o.group_id = 3
ORDER BY o.purchase_id, o.created_at DESC

等效的 HQL 语句是什么?

假设 created_at 值在每个 purchase_id 中是唯一的,那么下面的 HQL 应该有效

from Orders
WHERE (purchase_id, created_at) 
      IN  
      (   SELECT purchase_id, max( created_at ) 
          FROM Orders
          GROUP BY purchase_id 
      )

created_at 对于给定的 purchase_id 不是唯一的(purchase_id 的一个值可能有两个 "latest" 记录具有相同的 created_at 值),则需要更深层次的子查询——下面的 HQL 将只选择一个最高 created_at 的记录,然后为每个 purchase_id 选择最高 id 的记录(这次假设 ID 是主 ID密钥并且是唯一的):

from Orders
WHERE id IN (
   SELECT max( id ) from Orders
   WHERE (purchase_id, created_at) 
         IN  ( 
           SELECT purchase_id, max( created_at ) 
           FROM Orders
           GROUP BY purchase_id 
          )
   GROUP BY purchase_id
 )