Как запросить текущее состояние всех объектов в таблице базы данных, управляемой событиями? - PullRequest
0 голосов
/ 30 апреля 2019

В настоящее время я реализую функцию черного списка для моего приложения. Поэтому я хочу использовать таблицу данных на основе событий, чтобы я также мог отслеживать, когда элемент был заблокирован и кем.

Чтобы дать вам немного контекста: вот так выглядит таблица

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;
...