此 SQL 查询的等效 HQL 查询是什么(从内部联接获取最大值)

What is the equivalent HQL query for this SQL query (fetch max value from Inner Join)

我已经完成了这个 SQL 查询(已测试并按预期工作):

SELECT c.carId, p.color as currentColor
FROM Car c
Inner join Paint p
ON( p.PaintId In (Select max(p2.PaintId) From Paint p2 where p2.carId = c.carId) )

什么是等效的 HQL 查询? (假设 Class 名称和属性与数据库相同 Table/columns)

请注意,不能使用 'Order by paintId' 和 setMaxResults。我需要在查询中获取 currentColor,因为稍后我需要在 WHERE 语句中使用它


附加信息

我有一个包含 2 个实体的数据库:汽车和油漆,其中一辆汽车可以有一个或多个油漆。

例如此查询将获取 carId = 15

的汽车的最新油漆
Select max(p2.PaintId) From Paint p2 where p2.carId = 15

我正在尝试创建一个查询,我可以在其中根据最近的油漆(最大 paintId)过滤汽车。 所需的输出应该是 Car Class 的实例。每行一个实例,所以 HQL 语句应该像

Select distict c 
From Car c
...

由于是inner join,在select子句中不用p2,可以将子查询移到where子句中。

SELECT c.carId, s.color as currentColor
FROM 
  Car c,
  Paint p
WHERE
  p.PaintId In (
    Select max(p2.PaintId) 
    From Paint p2 
    where p2.carId = c.carId)

(顺便说一句,s 在您的查询中不存在。)


编辑:阅读您的附加信息后:

如果汽车最多只能有两种油漆,我想知道你为什么不把它加载到内存中并以面向对象的方式进行:

var car = session.Query...
var carsLastPaint = oneCar.Paints.Last();

您可以使用特殊功能 maxindex 并访问 Paints 列表中的最后一个值:

select c as car, p as lastPaint
from Car c join c.Paints p
where 
  p = c.Paints[maxindex(c.Paints)] 
  and c.id = :carId

查看 Hibernate documentation 以获得更多强大功能:-)