我有一个数据库被用作一种版本控制系统。也就是说,我不是更新任何行,而是添加一个具有相同信息的新行。每行还包含一个version
列,它是一个日期时间戳,因此唯一的区别是新行将具有更新的时间戳。
我遇到的问题是编写一个有效的hibernate查询来返回这些行的最新版本。例如,这些是名为Product
的表中的行,带时间戳的列为version
。表中有多个版本的多个产品。所以可能有多个版本(行)的ProductA,多个版本的ProductB等。我想抓住每个版本的最新版本。
我可以在一个hibernate查询中执行此操作吗?
session.createQuery("select product from Product product where...?");
或者这需要一些中间步骤?
答案 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
更新的产品。
希望这有帮助。
答案 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