Подсказка HINT_PASS_DISTINCT_THROUGH уменьшает количество сущностей, возвращаемых на страницу для PageRequest, до значения ниже настроенного размера страницы (PostgreSQL) - PullRequest
0 голосов
/ 30 апреля 2019

Я настраиваю реализацию репозитория на основе Спецификаций 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 - это база данных, стоящая за приложением ввопрос

...