我想从 Spring 实现滚动 API。这样,当用户在前端滚动时,前端每次发出请求时都会加载新数据。
我尝试限制 Spring 返回的结果,并且正在尝试各种方法。
- 页面请求
// 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>
}
这总是返回整个表。
- 调整 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?
)
结果相同,它返回整个表。
- 使用限制
// 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)
)
结果相同,它返回整个表。
如何使用 Spring Scroll API 限制结果?
“问题”在于您对 的使用
WindowIterator
。这将不断迭代连续的Window
(这是迭代器的要点),直到没有更多内容可检索。因此问题不在于 Spring Data,而在于您对 的使用
WindowIterator
。只需将其删除并按原样返回Window
,或者只需使用toList
将其转换为List
。