TotalElements возвращает неверное значение для полных строк с данными

#java #spring #spring-boot #jpa #spring-data-jpa

#java #весна #spring-boot #jpa #spring-data-jpa

Вопрос:

Я хочу реализовать запрос, который возвращает постраничный запрос / ответ.

 @Repository
@SuppressWarnings("all")
public interface OfferingsRepository extends JpaRepository<Offerings, UUID>,
        CustomJpaSpecificationExecutor<Offerings> {
        .......
}
 

Сделайте запрос в таблицу с 23 строками:

 Page<Offerings> all = offeringsRepository .findAll(
                new Offerings(searchCriteria, relevance),
                PageRequest.of(0, 20));

        long count = all.getTotalElements();
 

Количество должно быть 23, но я получаю 20. Я не могу понять, почему я получаю значение 20. Оно должно быть 23. Вы знаете, как я могу решить эту проблему.

Ответ №1:

Вам необходимо указать отдельный запрос countQuery в вашем API. По умолчанию вы получаете количество записей, возвращаемых методом findAll(), которое входит в топ-20.

Пример кода для вашего интерфейса:

 @Query(name = "SELECT offr FROM Offerings offr", countQuery = "SELECT count(offr) FROM Offerings offr")
  Page<Offerings> findAll();
 

Комментарии:

1. К сожалению, этот код находится в библиотеке, которую я не могу изменить. Любое другое решение?

2. Можно ли как-то расширить findAll() до включения countQuery = "SELECT count(offr) FROM Offerings offr" без добавления запроса, потому что у меня сложная спецификация и внутреннее соединение?

3. Вероятно, вам придется дублировать критерии, чтобы получить точное количество. К сожалению, вы не можете его расширить.

4. Еще один вопрос. Могу ли я использовать свою пользовательскую спецификацию сборки в собственный запрос, который вы вставили выше?

5. Я никогда этого не пробовал. Вы должны иметь возможность использовать countQuery со спецификацией. Это JPQL.