Я использую Hibernate Envers и PostgreSQL для отслеживания истории сущностей, и я хотел бы воспользоваться этим для отображения данных в аналитических целях.Например, я хотел бы установить число объектов в течение определенного периода, и я смог создать запрос для получения этого из таблиц Envers, то есть
with recursive times(t) as (
values
(1524700800000)
union all
select
t + (3600 * 1000)
from
times
where
t < 1527811200000
),
revisions(t, n) as (
select
times.t,
max(r.id)
from
times
left outer join REV r on r.timestamp <= times.t
group by
times.t
order by
times.t
)
select
r.t,
count(r.n)
from
revisions r
left outer join Order_AUD o on o.rev <= r.n
and o.revtype <> 2
and (
o.revend > r.n
or o.revend is null
)
group by
r.t
order by
r.t
, и я получил этот набор результатов
-----------------------+---
2018-04-26 00:00:00+00 | 0
2018-04-27 00:00:00+00 | 2
2018-04-28 00:00:00+00 | 5
2018-04-29 00:00:00+00 | 8
2018-04-30 00:00:00+00 | 8
2018-05-01 00:00:00+00 | 9
2018-05-02 00:00:00+00 | 9
, что правильно, так как показывает растущее число заказов каждый день.
Примечание. Я использую ValidityAuditStrategy
, чтобы столбец revend
был доступен.
Затем, если я хочу отфильтровать агрегацию, например, подсчет только заказов в определенном статусе, я могу добавить предикат к предложению соединения:
select
r.t,
count(r.n)
from
revisions r
left outer join Order_AUD o on o.rev <= r.n
and o.revtype <> 2
and (
o.revend > r.n
or o.revend is null
)
and o.status = 'pending'
Здесь я использую таблицы CTE и таблицы времени выполнения, которые яя не могу использовать с API Envers, поэтому мой вопрос:
Как мне достичь эквивалентного результата с API Envers (если это вообще возможно)?