此 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 以获得更多强大功能:-)
我已经完成了这个 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 以获得更多强大功能:-)