Я настраиваю реализацию репозитория на основе Спецификаций JPA, которая использует спецификации jpa (созданные на основе строк фильтра RSQL) для фильтрации результатов, определения порядка следования результатов и удаления любых дубликатов через «отличительные», которые в противном случае были бы возвращены из-за присоединениястолы.Метод построителя спецификаций JPA объединяет несколько таблиц и устанавливает «отдельный» флаг:
final Join<Object, Object> rootJoinedTags = root.join("tags", JoinType.LEFT);
final Join<Object, Object> rootJoinedLocations = root.join("location", JoinType.LEFT);
...
query.distinct(true);
Чтобы разрешить сортировку по столбцам объединенной таблицы, я применил подсказку «HINT_PASS_DISTINCT_THROUGH» к соответствующему методу репозитория (в противном случае,сортировка по столбцам объединенной таблицы возвращает ошибку по строкам «столбец сортировки должен быть включен в запрос SELECT DISTINCT»).
@QueryHints(value = {
@QueryHint(name = org.hibernate.jpa.QueryHints.HINT_PASS_DISTINCT_THROUGH, value = "false")
})
Page<SomeEntity> findAll(@Nullable Specification<SomeEntity> spec, Pageable pageable);
Аргументы для указанного метода хранилища построены так:
final Sort sort = getSort(searchFilter);
final Specification spec = getSpecificationIfPresent(searchFilter);
final PageRequest pageRequest = PageRequest.of(searchFilter.getPageNumber(), searchFilter.getLimit(), sort);
return eventRepository.findAll(spec, pageRequest);
После этих изменений кажется, что фильтрация и сортировка работают должным образом.Однако подсказка, по-видимому, приводит к тому, что после того, как страница результатов уже создана, применяется «отдельная» фильтрация, что уменьшает количество возвращаемых объектов на странице с настроенного аргумента PageRequest «size» до того, что остается после фильтрации дубликатов.из.Например, если бы мы сделали PageRequest с «page = 0» и «pageSize = 10», то получившаяся страница может вернуть только 5 экземпляров «SomeEntity», хотя база данных содержит гораздо больше записей (177 объектов, если быть точным вэтот случай).Если я уберу подсказку, то число возвращаемых сущностей снова будет правильным.
Вопрос: есть ли способ заставить ту же настройку запроса Спецификации работать с страницами правильного размера (некоторые другие подсказки, которые могут быть добавлены для дублирования)фильтрация выполняется до создания объекта Page)?Если нет, то есть ли другой подход, который я мог бы использовать для достижения требуемой фильтрации на основе спецификаций, с сортировкой по объединенным столбцам и удалением дубликатов, как при «отличном»?
PS: PostgreSQL - это база данных, стоящая за приложением ввопрос