Spring Data Paging через объединенный результат нескольких запросов - PullRequest
0 голосов
/ 26 сентября 2018

Мы используем Spring Boot 2 с Spring Data и его функцией PagingAndSortingRepository.Это хорошо работает для отдельных запросов, но в одном случае мы должны сделать три разных запроса и реализовать разбиение на страницы для комбинированного результата.

Каков наилучший способ сделать это?

Вот что япопытался:

1) Написать запрос типа UNION или JOIN, который уже возвращает объединенный результат в виде страницы или слайса.Однако этот запрос занимает почти в 10 раз больше времени, чем три отдельных запроса и агрегация в Java.Здесь речь идет о сложных вычислениях (серверная часть PostGIS).

2) Построение страниц / фрагментов вручную с использованием существующих классов SliceImpl или PageImpl.Это отлично работает для первоначального запроса, но завершается неудачно при втором запросе, когда пользователь говорит что-то вроде: дайте мне страницу 1 (размер страницы == 10 элементов).На первой странице (страница 0) может быть 4 элемента из первого запроса и 6 из 12 элементов из второго запроса.Запрос на странице 1 дает мне тогда 0 результатов из первого запроса и 2 (вместо 6) из второго, заполняя остальное из третьего запроса.Совершенно очевидно, что это не может работать с логической точки зрения.

Любые другие идеи?

Редактировать: мы планируем добавить Hibernate Search и Caching, что может решить эту проблему извне, выбрав опцию1) достаточно быстро.Мой вопрос предназначался для того, чтобы попросить «внутреннее» решение, то есть некоторый код, который я могу написать сегодня, пока у нас не будет внешнего решения.

1 Ответ

0 голосов
/ 26 сентября 2018

Как вы описали в пункте 2, если вы не всегда оставляете соединение между запросами, никто не может гарантировать вам, что того, что вы получили с первой частью запроса, достаточно для создания страницы из 10 допустимых элементов.

Реализация логики, которая находит элемент до тех пор, пока страница не будет заполнена, это наверняка дороже, чем один запрос ... особенно, когда вам приходится увеличивать страницы все больше и больше.

Я думаю, вам нужно объединить все ваши запросы в одном запросе.

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

Иметь кеш-фреймворк тоже может помочь.

...