Hibernate查询 - 按时间戳获取最新版本?

时间:2010-05-01 23:38:25

标签: java hibernate orm hql

我有一个数据库被用作一种版本控制系统。也就是说,我不是更新任何行,而是添加一个具有相同信息的新行。每行还包含一个version列,它是一个日期时间戳,因此唯一的区别是新行将具有更新的时间戳。

我遇到的问题是编写一个有效的hibernate查询来返回这些行的最新版本。例如,这些是名为Product的表中的行,带时间戳的列为version。表中有多个版本的多个产品。所以可能有多个版本(行)的ProductA,多个版本的ProductB等。我想抓住每个版本的最新版本。

我可以在一个hibernate查询中执行此操作吗?

session.createQuery("select product from Product product where...?");

或者这需要一些中间步骤?

2 个答案:

答案 0 :(得分:2)

要回答这个问题,每个产品都需要某种标识符。由于可能有多个版本,我们需要知道“什么是产品”我假设product.id已经出局,因为这可能是一个替代密钥。为了举个例子,我会选择product.name

以下是检索每种产品的最新版本的单个查询:

select p1 from Product p1 where
  p1.timestamp >= all (
     select p2.timestamp from Product p2 where
      p2.name=p1.name
  )

(我的HQL有点生疏,但我希望你明白这一点。)

诀窍是不同时间戳的同类产品之间的自联接。 p1产品最近被修改为p2。要查找最新的p1,我们会发现没有p2值的行 - 即没有比p1更新的产品。

编辑:我修改了查询 - 我最近看到有人在论坛帖子中使用了“on”语法,但我现在记得那是无效的HQL。很抱歉 - 我没有可供测试的系统。它现在使用一个相关的子查询,其功能与JOIN相同。

希望这有帮助。

答案 1 :(得分:0)

要查找特定产品的最新版本:

select product where ... order by version DESC

也为该版本添加了一个复合键。

要查找所有产品的最新版本,您需要两个查询(或子查询):

Insert into TMP (id, version) select (id, max(version)) from product group by id);
select P.* Product P, TMP where TMP.ID = P.ID