我在尝试找出 HQL 语句时遇到了麻烦。我正在尝试获取组内所有产品订单的最新状态,但似乎无法找出正确的 HQL 语法来使其正常工作...
示例表:
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。应生成此表:
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 值可能有两条具有相同 created_at
值的“最新”记录>),那么需要更深层次的子查询 - 下面的 HQL 将仅选择一条具有最高 created_at
和每个 purchase_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
)
关于java - 从表中获取最新的列,并按 HQL 中的另一列进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40699854/