【发布时间】:2021-06-22 02:22:27
【问题描述】:
如何将分页应用于以下查询:
@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
@Query("select b from Building b where b.id in :ids" )
Page<Post> findByIds(@Param("ids") List<Long> postIdsList);
...
}
所有现有示例均基于接受Pageable 对象的标准findAll 方法:public Page findAll(Pageable pageable);。
问题是:
- 控制器方法签名应该是什么
- 存储库方法参数应该是什么
- 应如何以及将哪些参数传递给控制器方法
- 我应该总是为每个请求拆分帖子 ID
- Spring 是否会进行一次查询并将所有找到的帖子保存在内存中,或者每次下一页/上一页都会点击查询?如果是这样,它如何找出用于查找下一个/上一个帖子的 ID?
最初的实现如下:
@RestController
class PostsController {
@Autowired
private PostService postService;
@GetMapping("/posts", params = "ids")
public List<Post> getPaginatedPosts(@RequestParam List<Long> ids) {
return postService.findPaginatedPosts(ids);
}
}
@Repository
@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
@Query("select b from Building b where b.id in :ids" )
Page<Post> findByIds(@Param("ids") List<Long> postIdsList);
...
}
我省略了 PostServiceImpl 中的代码 qui 实现了 PostService 并且只调用了 PostRepository#findByIds 方法。
【问题讨论】:
-
这引出了一个问题:如果客户端知道它应该获取的 id,为什么不通过简单地限制请求中发送的 id 列表来处理分页?
-
@crizzis:因为前面有超过 20 个 ID,通过添加分页/排序参数来调整 URL 比玩集合并到处剪切它更容易页。所以我更愿意让 Spring 就地执行。更重要的是,我认为这就是大多数分页库的工作方式。
标签: spring-boot rest spring-data-jpa pagination