【问题标题】:What is the equivalent HQL query for this SQL query (fetch max value from Inner Join)此 SQL 查询的等效 HQL 查询是什么(从 Inner Join 获取最大值)
【发布时间】:2015-06-10 09:57:34
【问题描述】:

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

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


附加信息

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

例如此查询将获取 carId = 15 的汽车的最新油漆

Select max(p2.PaintId) From Paint p2 where p2.carId = 15

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

Select distict c 
From Car c
...

【问题讨论】:

  • 你想要的输出是什么,即 Hibernate 应该返回Car 实例列表还是简单的Object[]
  • @mabi,好点,我已经编辑了我的问题来回答你。我需要一个 Car 实例列表。

标签: sql hibernate hql


【解决方案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 并访问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 了解更多功能:-)

【讨论】:

  • 在 Where 语句而不是 Inner Join On/With 中是否存在性能损失检查?
  • 我不这么认为。执行计划甚至可能相同。
  • 我已经解决了我的问题,只需将我的支票从Join 语句移动到Where,正如您所指出的。但是maxindex 也可能很快就会派上用场。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 2017-07-12
  • 2017-08-16
相关资源
最近更新 更多