Борьба со следующим сценарием:
Сущность
@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?