В настоящее время я реализую функцию черного списка для моего приложения. Поэтому я хочу использовать таблицу данных на основе событий, чтобы я также мог отслеживать, когда элемент был заблокирован и кем.
Чтобы дать вам немного контекста: вот так выглядит таблица
id|object_id |object_type|change_time |change_type|
--|----------|-----------|-------------------|-----------|
0|1234567890|ITEM |2019-04-29 15:12:42|BLACKLISTED|
1|654321 |MATERIAL |2019-04-29 15:14:19|BLACKLISTED|
2|654321 |MATERIAL |2019-04-29 15:14:58|CLEARED |
Поскольку я использую spring и spring-data-jpa, довольно просто получить текущее состояние одного элемента при запросе первого результата, упорядоченного по времени.
@Repository
public interface ItemFilterRepository extends JpaRepository<ItemFilterDpo, Integer> {
ItemFilterDpo findFirstByObjectIdAndObjectTypeOrderByChangeTimeDesc(String objectId, ItemFilterObjectTypeDpo type);
}
Однако я не могу найти хорошее решение для отображения всех предметов, которые в данный момент заблокированы.
Итак, я посмотрел здесь на переполнение стека и нашел ответ, используя подзапросы в sql ( SQL-запрос для текущего состояния всех сущностей в таблице событий ).
select
object_id, object_type, change_time, change_type as last_modified
from
item_filter ife
where
ife.change_time = (
select max(ife2.change_time)
from item_filter ife2
where ife.object_id=ife2.object_id
)
Это дает мне следующий результат, который я могу отфильтровать для BLACKLISTED
впоследствии:
object_id |object_type|change_time |last_modified|
----------|-----------|-------------------|-------------|
1234567890|ITEM |2019-04-29 15:12:42|BLACKLISTED |
654321 |MATERIAL |2019-04-29 15:14:58|CLEARED |
Чтобы использовать это с данными Spring, мой первый подход - создать представление и запрос из этого.
Мне бы очень хотелось узнать, существует ли лучший подход, использующий данные Spring для запроса текущего состояния всех объектов в событии с датой.
Если другой каркас подходит лучше для моей проблемы, я рад знать.
Edit:
Использование distinct on
чувствует себя немного лучше, однако это не решает мою проблему с данными Spring.
select distinct on (object_id, object_type)
object_id, object_type, change_time, change_type as last_modified
from
item_filter bl
order by
object_id, object_type, change_time DESC;