#java #hibernate
#java #спящий режим
Вопрос:
Этот вопрос касается построения правильного Criteria
в гибернации для следующего случая.
Предположим, я начинаю с такой таблицы:
id ts metric value carrier
1 1 distance 4 alice
2 1 count 2 alice
3 2 distance 3 alice
4 2 count 1 alice
5 1 distance 3 becky
6 1 count 2 becky
7 2 distance 4 becky
8 2 count 1 becky
9 1 distance 10 other
10 1 count 10 other
11 2 distance 10 other
12 2 distance 10 other
Это набор показателей с привязкой ко времени, фиксирующий, как далеко, и общий перенос некоторых элементов. alice
becky
other
count
distance
Я бы хотел свернуть его следующим образом: сохраняются показатели с «другим» или «победителем», определяемые distance
для каждого временного интервала. Таким образом, приведенная выше таблица даст следующий набор результатов:
id ts metric value carrier
1 1 distance 4 alice
2 1 count 2 alice
7 2 distance 4 becky
8 2 count 1 becky
9 1 distance 10 other
10 1 count 10 other
11 2 distance 10 other
12 2 distance 10 other
В конечном итоге это преобразуется в это:
ts carrier distance count
1 alice 4 2
1 other 10 10
2 becky 4 1
2 other 10 10
Но этот перевод я уже понимаю, как это сделать. Мне неясно, как создать критерии для сохранения метрик «top n». Что подводит нас к проблеме: хотя этот пример упрощен, будет большое количество «носителей», и меня интересуют верхние n
такие носители, отбрасывая остальные. Таким образом, в приведенном выше примере n = 1
, но это, вероятно, будет больше, чем 1
в большинстве случаев.
Я знаю, что могу использовать addOrder(Order.desc("value")
, но это создает проблему, other
поскольку она смешивается, а расстояния и количество будут неправильно перемешаны. Я ищу что-то, что сортирует «блоки» строк, которые определяются по порядку ts
, затем carrier
, затем, используя metric = "distance"
для порядка сортировки.
Комментарии:
1. Это похоже на то, для чего я бы использовал оконные функции , если бы работал с SQL в Postgres, но Hibernate может быть не так легко приспособлен для таких вещей.
2. @Kayaman Возможно, но я не смог найти никакой прямой поддержки для этого в режиме гибернации.
3. Это то, что я имел в виду. Расширения, специфичные для базы данных, вряд ли будут поддерживаться в режиме гибернации, поэтому я очень сомневаюсь, что criteria API сможет делать то, что вы хотите. Если вы можете придумать стандартный SQL для выполнения вышеуказанных действий, это будет совсем другой зверь.