【发布时间】:2020-06-19 15:35:50
【问题描述】:
我正在尝试使用 nextPageToken 实现分页。
我有桌子:
CREATE TABLE IF NOT EXISTS categories
(
id BIGINT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
parent_id BIGINT REFERENCES categories (id)
);
所以我有实体类别:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@Column(name = "name")
private String name;
@OneToOne
@JoinColumn(name = "parent_id", referencedColumnName = "id")
private Category category;
我真的不明白我接下来要做什么。 客户端请求令牌(保留什么?)
假设我有控制器:
@GetMapping
public ResponseEntity<CategoriesTokenResponse> getCategories(
@RequestParam String nextPageToken
) {
return ResponseEntity.ok(categoryService.getCategories(nextPageToken));
}
服务:
public CategoriesTokenResponse getCategories(String nextPageToken) {
return new CategoriesTokenResponse(categoryDtoList, "myToken");
}
@Data
@AllArgsConstructor
public class CategoriesTokenResponse {
private final List<CategoryDto> categories;
private final String token;
}
我必须如何为此实现 sql 查询?以及如何为每个 id 生成 nextPagetoken?
SELECT * FROM categories WHERE parent_id = what?
AND max(category id from previous page = token?)
ORDER BY id LIMIT 20;
【问题讨论】:
-
你有没有想过为 REST 或 JPA 使用 spring boots 内置的分页功能?
-
一个聪明人说,由于 OFFSET 和其他原因,它的实现不好,这是个坏主意,所以我尝试实现自定义分页
-
我认为,如果您可以使用经过实战验证的解决方案,请使用它,除非您有证据证明它不适合您,即您已经对其进行了分析以发现此实现是,是什么扼杀了你的表现。否则,您很可能最终会在微优化上浪费金钱,并且可能甚至无法证明您已经优化了任何东西,因为缺少比较测量。
-
不要听你所听到的一切。即使是我,现在也是。
-
@derM 所以 PagingAndSortingRepository 总是在生产中使用?我需要像现在这样的字段 parent_id 吗?
标签: java sql spring pagination token