Hibernate Query - Получить последние версии по метке времени?
У меня есть база данных, которая используется как своего рода система контроля версий. То есть, вместо того, чтобы обновлять какие-либо строки, я добавляю новую строку с той же информацией. Каждая строка также содержит version
столбец, который является отметкой времени даты, поэтому единственное отличие состоит в том, что новая строка будет иметь более позднюю отметку времени.
У меня проблемы с написанием эффективного запроса гибернации для возврата последней версии этих строк. Для примера, это строки в таблице с именем Product
столбец с меткой времени version
, В таблице представлено несколько версий нескольких продуктов. Таким образом, может быть несколько версий (строк) ProductA, несколько версий ProductB и т. Д. И я хотел бы получить последнюю версию каждой.
Могу ли я сделать это в одном запросе гибернации?
session.createQuery("select product from Product product where...?");
Или это потребует некоторых промежуточных шагов?
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
,
РЕДАКТИРОВАТЬ: я пересмотрел запрос - я видел, что кто-то недавно использовал синтаксис "на" в сообщении на форуме, но теперь я помню, что это не является допустимым HQL. Извините за это - у меня нет системы для тестирования. Теперь он использует коррелированный подзапрос, который функционирует так же, как JOIN.
Надеюсь это поможет.
Чтобы найти последнюю версию определенного продукта:
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