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

时间:2015-06-10 09:57:34

标签: sql hibernate hql

我已经按照我的方式处理了这个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查询? (假设类名和属性与DB表/列相同)

请注意使用'按paintId排序'和setMaxResults不是一个选项。我需要在查询中获取currentColor,因为我需要稍后在WHERE语句中使用它

其他信息

我有一个包含2个实体的数据库:Car和Paint,其中Car可以有一个或多个Paint。

e.g。此查询将使用carId = 15

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

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

Select distict c 
From Car c
...

1 个答案:

答案 0 :(得分:1)

由于它是内部联接,并且您不在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并访问“颜料”列表中的最后一个值:

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处查看更多功能: - )