JPQL продолжит выбирать записи, пока не будет выполнено условие - PullRequest
1 голос
/ 04 апреля 2019

Борьба со следующим сценарием:

Сущность

@Table(name = "orders")
public class OrderEntity {

@Id
@Column(name = "id")
@Type(type = "uuid-char")
private UUID id;

...

@Column(name = "total_items")
private Integer totalItems;

@Column(name = "create_date")
private LocalDateTime createDate;

}

Мне нужно выбрать как можно больше OrderEntity объектов, пока не объединится SUM из totalItems меньше или равно некоторому целочисленному значению (то есть 500).

Итак, допустим, у меня есть 3 записи в базе данных:

  • OrderEntity1 (totalItems =100)
  • OrderEntity2 (totalItems = 200)
  • OrderEntity3 (totalItems = 300)

Предполагая, что пороговое значение для объединенного значения totalItems равно 500, запрос долженвернуть OrderEntity1 и OrderEntity2.Если порог будет снижен до 250, тогда будет возвращено только OrderEntity1.

Используя код Java, я бы сделал это так:

        List<OrderEntity> orders = orderRepository.findAll();

        int threshold = 500;
        int aggregatedTotalItems = orders.get(0).getTotalItems();

        for (int i = 1; i < orders.size(); i++) {
            // Increment intermediate result
            aggregatedTotalItems  += orders.get(i).getTotalItems();

            // Validate intermediate result
            if (aggregatedTotalItems > threshold) {
                orders = orders.subList(0, i); // limit orders collection from first to (current - 1) order
            }
        }
    }

Возможно ли достичьто же самое с JPQL?

1 Ответ

2 голосов
/ 04 апреля 2019

Это было бы довольно просто и, скорее всего, гораздо быстрее решить с помощью стандартного SQL напрямую:

SELECT *
FROM (
  SELECT 
    t.*,
    row_number() OVER (ORDER BY o.id) rn,
    count(*) OVER () c
  FROM (
    SELECT 
      o.* 
      SUM(total_items) OVER (ORDER BY o.id) s -- Replace by your order criteria
    FROM orders o
  ) t
  WHERE s < 500
) t
WHERE rn < c;

Даже MySQL 8 теперь поддерживает оконные функции. JPQL нет. Я искренне сомневаюсь, что вы найдете элегантное и эффективное решение с JPQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...