Как перебрать каждую страницу, возвращаемую критерием JPA?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как перебрать каждую страницу, возвращаемую критерием JPA?

Сообщение Anonymous »

Мне нужно построить фоновый процесс, который будет периодически обрабатывать все элементы таблицы базы данных.
Поскольку я не могу загрузить все элементы в память, мне нужно разделить базу данных на подчасти. К сожалению, я не могу использовать тип возвращаемого значения JPQL Stream, поскольку в запросе используется сложная логика на основе фильтров, которую невозможно реализовать путем написания запроса JPQL.
Таким образом, я построил следующий критерийный запрос , чтобы вернуть только страницу продуктов. После того как я обработал страницу, как я могу перебирать следующую, пока не обработаю их все?
import org.springframework.data.jpa.repository.query.QueryUtils;

@Repository
@AllArgsConstructor
public class ProductRepositoryImpl implements CustomProductRepository {

private final EntityManager entityManager;

@Override
public Page getProducts(Pageable pageable, /* fields used to filter the results */) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Product.class);
Root root = criteriaQuery.from(Product.class);

List predicates = getPredicates(/* fields used to filter the results */);

criteriaQuery.where(combinePredicatesWithAndStatement(criteriaBuilder, predicates))
.orderBy(QueryUtils.toOrders(pageable.getSort(), root, criteriaBuilder));

List result = entityManager.createQuery(criteriaQuery)
.setFirstResult((int) pageable.getOffset())
.setMaxResults(pageable.getPageSize())
.getResultList();

CriteriaBuilder criteriaBuilderCount = entityManager.getCriteriaBuilder();
CriteriaQuery countQuery = criteriaBuilderCount.createQuery(Long.class);
Root rootCount = countQuery.from(Product.class);

List predicatesCount = getPredicates(/* fields used to filter the results */);

countQuery.select(criteriaBuilderCount.count(rootCount))
.where(combinePredicatesWithAndStatement(criteriaBuilderCount, predicatesCount));

Long totalElements = entityManager.createQuery(countQuery).getSingleResult();

return new PageImpl(result, pageable, totalElements);
}

private List getPredicates(/* fields used to filter the results */) {
List predicates = new ArrayList();
// assemble predicates based on some complex conditions not replicable with JPQL
return predicates;
}

private Predicate combinePredicatesWithAndStatement(CriteriaBuilder criteriaBuilder, List predicates) {
return criteriaBuilder.and(predicates.stream().filter(Objects::nonNull).toArray(Predicate[]::new));
}
}


Подробнее здесь: https://stackoverflow.com/questions/778 ... a-criteria
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • В чем разница между критерием и оценкой в ​​Gridsearchcv
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Как я могу перебрать два списка, а затем добавить каждую пару в кортеж [дубликат]
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Код C#, перенесенный из Javascript, дает другую возвращаемую строку
    Гость » » в форуме Javascript
    0 Ответы
    57 Просмотры
    Последнее сообщение Гость
  • Получить ссылку на smart_pointer, возвращаемую функцией
    Anonymous » » в форуме C++
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Как я могу запустить задачу, возвращаемую методом?
    Anonymous » » в форуме C#
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»