首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GraphQL:如何用graphQL实现分页?

GraphQL:如何用graphQL实现分页?
EN

Stack Overflow用户
提问于 2017-06-15 18:57:20
回答 1查看 10.4K关注 0票数 11

目前,我发现graphql-java库中没有对分页的现有支持。它确实有一些基本的中继支持,可以在其中创建一个connection,这是Facebook推荐的实现分页的方法。

是帮助实现这一目标的方法。但是,由于没有文档,我发现很难理解这个函数是如何工作的。如果某人已经有了一个允许使用graphql库进行基本查询(如Adddeletefetch等)的现有模型,那么他们是否可以分解他们添加分页支持的步骤呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-16 12:32:56

您甚至不需要中继连接来支持分页。您的查询可以简单地接受一个页码和大小(或限制/偏移量)作为参数,并返回一个已完成的列表。但是,如果您想要对例如Book类型进行中继连接,您可以执行如下操作:

代码语言:javascript
复制
Relay relay = new Relay();
GraphQLOutputType book = ...; //build your normal Book object type
GraphQLObjectType bookEdge = relay.edgeType(book.getName(), book, null, Collections.emptyList());
GraphQLObjectType bookConnection = relay.connectionType(book.getName(), bookEdge, Collections.emptyList());

因此,您将有一个符合BookConnection继电器连接规范类型。

至于使用basic GraphQL的示例,您有一个简单的web应用程序这里

连接规范很自然地适合支持基于游标的分页的数据存储,但在使用不同的分页样式时需要一些创造性。

1)如果希望使用简单的基于偏移量的分页,可以决定将after视为偏移量(意味着将传递一个数字),并将first视为限制:

代码语言:javascript
复制
SELECT * FROM ORDER BY timestamp OFFSET $after LIMIT $first

beforelast也是一样,只是方向不同。

2)另一种方法是将after/before视为排序列的最后一个可见值(因此将传递一个实际(模糊)值):

代码语言:javascript
复制
SELECT * FROM ORDER BY timestamp WHERE timestamp > $after LIMIT $first

我还建议您看看我的项目graphql示例应用程序,这使得开发GraphQL API变得非常简单。

例如,您可以创建一个分页结果,如下所示:

代码语言:javascript
复制
public class BookService {
    @GraphQLQuery(name = "books")
    //make sure the argument names and types match the Relay spec
    public Page<Book> getBooks(@GraphQLArgument(name = "first") int first, @GraphQLArgument(name = "after") String after) {
        //if you decide to fetch from a SQL DB, you need the limit and offset instead of a cursor
        //so, you can treat "first" as count as "after" as offset
        int offset = Integer.valueOf(after);
        List<Book> books = getBooksFromDB(first, offset);
        Page<Book> bookPage = PageFactory.createOffsetBasedPage(books, totalBookCount, offset);
        return bookPage;
    }
}

还有很多其他方法来创建Page实例,这是最直接的方法。

然后从Java类生成一个模式:

代码语言:javascript
复制
GraphQLSchema schema = new GraphQLSchemaGenerator()
       .withOperationsFromSingleton(new BookService())
       .generate();
GraphQL graphQL = GraphQLRuntime.newGraphQL(schema).build();

并执行查询:

代码语言:javascript
复制
ExecutionResult result = graphQL.execute("{books(first:10, after:\"20\") {" +
                "   pageInfo {" +
                "       hasNextPage" +
                "   }," +
                "   edges {" +
                "       cursor, node {" +
                "           title" +
                "}}}}");

但是,再说一遍,--如果您不使用Relay --实际上没有必要使变得过于复杂。如果您的存储自然支持基于游标的分页,请执行它。如果没有,只需使用简单的限制/偏移量参数并返回一个列表,然后忘记连接规范。创建它是为了使中继能够在各种情况下自动管理分页,所以如果不使用带有基于游标的分页的Relay和/或DB,则几乎总是会造成完全过度。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44574964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档