Большой Resultset с Spring Boot и QueryDSL - PullRequest
0 голосов
/ 20 января 2019

У меня есть приложение Spring Boot, где я использую QueryDSL для динамических запросов.Теперь результаты должны быть экспортированы в виде CSV-файла.Модель Order, которая содержит продукты.Продукты должны быть включены в CSV-файл.Однако, поскольку существует много тысяч заказов с миллионами продуктов, их не следует загружать в память сразу.

Однако решения, предложенные Hibernate (ScrollableResults) и потоки, не поддерживаются QueryDSL.

Как этого достичь, продолжая использовать QueryDSL (чтобы избежать дублирования логики фильтрации)?

1 Ответ

0 голосов
/ 21 января 2019

Одним из способов решения этой проблемы является продолжение итерации с использованием offset и limit.

Что-то вроде:

long limit = 100;
long lastLimitUsed = 0;

List<MyEntity> entities = new JPAQuery<>(em)
    .from(QMyEntity.entity)
    .limit(limit)
    .offset(lastLimitUsed)
    .fetch();
lastLimitUsed += limit;

При таком подходе вы можете получать меньшие порции данных. Важно проанализировать, будут ли поля limit и offset хорошо работать с вашим запросом. Существуют ситуации, когда даже если вы используете limit и offset, вы в конечном итоге выполните полное сканирование таблиц, задействованных в запросе. Если это произойдет, вы столкнетесь с проблемой производительности вместо памяти.

...