Quero implementar a API scroll do Spring. Para que quando um usuário rola no Front End, novos dados sejam carregados a cada solicitação do Front end.
Tento limitar os resultados retornados pelo Spring e estou tentando de várias maneiras.
- Solicitação de página
// Service
fun getOrders(customerId: Long): List<OrderDto> {
val customer = customerRepository.findById(customerId).getOrElse { return emptyList() }
val orders: WindowIterator<Order> = WindowIterator.of<Order> { position ->
orderRepsitory.findAllByCustomerOrderByCreated(
customer,
position as KeysetScrollPosition?,
PageRequest.of(0, 20)
)
}
.startingAt(ScrollPosition.keyset())
val ordersResult: MutableList<Orders> = ArrayList<Orders>()
orders.forEachRemaining { ordersResult.add(it) }
return ordersResult.map {
OrderDto(...)
}
}
// Order Respository
interface OrderRepository : JpaRepository<Order, Long> {
fun findAllByCustomerOrderByCreated(
customer: Customer,
position: KeysetScrollPosition?,
pageable: Pageable,
): Window<Order>
}
Isso sempre retorna a tabela inteira.
- Ajuste a consulta JPA
// Order Respository
interface OrderRepository : JpaRepository<Order, Long> {
fun findFirst5ByCustomerOrderByCreated(
customer: Customer,
position: KeysetScrollPosition?,
): Window<Order>
}
// call to repository in service
orderRepsitory.findFirst5ByCustomerOrderByCreated(
customer,
position as KeysetScrollPosition?
)
Mesmo resultado, retorna a tabela inteira.
- Usando Limite
// Order Respository
interface OrderRepository : JpaRepository<Order, Long> {
fun findAllByCustomerOrderByCreated(
customer: Customer,
limit: Limit,
): Window<Order>
}
// call to repository in service
orderRepsitory.findAllByCustomerOrderByCreated(
customer,
position as KeysetScrollPosition?,
Limit.of(20)
)
Mesmo resultado, retorna a tabela inteira.
Como limitar os resultados com a API Spring Scroll?
O "problema" é o uso do
WindowIterator
. Isso continuará iterando s sucessivosWindow
(que é o ponto de um iterador) até que não haja mais nada para recuperar.Portanto, o problema não é o Spring Data, mas sim o uso do
WindowIterator
. Basta removê-lo e retorná-loWindow
como está, ou apenas usá-lotoList
para convertê-lo em um arquivoList
.