Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过nextPageToken实现分页?_Java_Sql_Spring_Pagination_Token - Fatal编程技术网

Java 如何通过nextPageToken实现分页?

Java 如何通过nextPageToken实现分页?,java,sql,spring,pagination,token,Java,Sql,Spring,Pagination,Token,我正在尝试使用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 = Genera

我正在尝试使用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));
    }

首先,您需要了解您在这里使用的是什么。每个实现都有某种限制或低效。例如,使用这样的页面标记仅适用于无限滚动页面。您不能跳转到任何特定页面。因此,如果我的浏览器崩溃,我在第100页,我必须再次滚动100页。当然,对于海量数据集来说速度更快,但如果您需要访问所有页面,这有关系吗?或者如果你一开始就限制了回报?比如只拿到前30页

基本上决定这一点:您是否只关心前几页,因为搜索/排序总是在使用?(就像一个用户从未使用过超过谷歌前1-5页的页面)数据集大吗?然后是伟大的用例。用户是否会选择“最近6个月内的所有项目”并实际需要所有项目,或者排序/搜索功能是否较弱?或者,您是否会返回所有页面,但不限制最多返回30页?或者,开发速度是否比0.1-3秒(取决于数据大小)的速度增长更重要?然后使用内置的JPA页面对象

我在700k记录上使用了页面对象,与70k记录相比,速度变化不到一秒。基于这一点,除非您计划建立一个庞大的数据集,否则我不认为删除偏移量会增加大量的价值。我刚刚用pageable测试了一个新系统,它在84毫秒内将第1页上的10个项目返回到我的工作网络中,vpn上的27k记录没有页面限制。一个记录超过500k的表需要131毫秒,这相当快。想快点吗?强制总最大返回30页,每页最多返回100个结果,因为通常情况下,他们不需要该表中的所有数据。他们还想要别的吗?优化搜索。此页面与seek/key stype页面之间的速度差小于1秒。这也是假设一个普通的SQL数据库。NoSQL在这里有点不同。Baeldung有大量关于jpa页面的文章,如下所示:

JPA分页的学习和实现应该不超过30分钟,它非常简单,并且在JPA存储库中有库存。我强烈建议您在seek/key风格的页面上使用它,因为您可能不会构建像google或facebook这样的系统

如果您确实想使用seek/key样式的分页,这里有一个很好的信息页面:

一般来说,您正在寻找的是将JOOQ与spring一起使用。此处的实施示例:

基本上,创建DSL上下文:

private final DSLContext DSL;

@Autowired
public JooqExample(DSLContext dslContext) {
    this.DSL= dslContext;
}
然后像这样使用它:

DSL.使用(配置)
.选择(PLAYERS.PLAYER\u ID,
玩家,名字,
玩家,姓,
球员。得分)
.来自(玩家)
.where(玩家游戏ID eq(42))
.orderBy(PLAYERS.SCORE.desc(),
PLAYERS.PLAYER\u ID.asc())
.seek(949,15)/(!)
.限额(10)
.fetch();

没有显式地使用seek谓词,只需传递上一个查询中的最后一条记录,jOOQ就会看到,在给定ORDER BY子句的情况下,跳过了该记录之前和包括该记录在内的所有记录。

您是否考虑过使用内置于REST或JPA分页的spring boots,由于偏移量和其他原因,这是一个糟糕的实现,这是一个糟糕的主意,所以我尝试实现自定义分页。我会争辩说,如果有一个经过战斗验证的解决方案,你可以使用,除非你有证据证明它不适合你,也就是说,你已经分析了它,发现这个实现是什么,是什么扼杀了你的性能。否则,你很可能会在微观优化上浪费金钱,很可能甚至无法证明你已经优化了任何东西,因为缺少比较度量。不要听你听到的每件事。即使是我,现在也是。@derM那么在生产中总是使用分页和排序存储库?我是否需要像现在这样的字段父id?谢谢,这是非常有用的答案!当我制作第一个api时,我对这个主题做了很多研究,因为它是为一个每年能获得160万条记录的系统设计的。另外,我建议阅读关于链接头的内容。我讨厌容器,所以不要让容器保存对象数据,而是在链接头中返回第一个、最后一个、下一个、上一个,主体可以只保存对象数据。我也不使用hateoas,除非它也是一个大系统。除非你有大量的消费者或者一个不断变化的系统,否则它是没有用的。
@Data
@AllArgsConstructor
public class CategoriesTokenResponse {
    private final List<CategoryDto> categories;
    private final String token;
}
SELECT * FROM categories WHERE parent_id = what?
AND max(category id from previous page = token?)
ORDER BY id LIMIT 20;
private final DSLContext DSL;

@Autowired
public JooqExample(DSLContext dslContext) {
    this.DSL= dslContext;
}