当前位置: 首页 > 面试题库 >

GraphQL:如何使用graphQL-java实现分页?

胡星汉
2023-03-14
问题内容

目前,在graphql-java库中看不到分页的现有支持。它确实具有一些基本的中继支持,在其中,我们可以创建connectionFacebook推荐的实现分页的方式。
这是有助于实现该目标的方法。但是,由于没有文档,因此很难理解此功能的工作原理。可有人击穿的步骤,他们将采取添加分页支持,如果他们已经有一个现成的模式,它允许像基本的查询Adddeletefetch等使用graphql-
Java库?


问题答案:

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

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符合Relay connection
spec的类型。

对于带有基本GraphQL的示例,您这里有一个简单的Web应用程序。

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

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

SELECT * FROM ORDER BY timestamp OFFSET $after LIMIT $first

before和和相同last,只是方向不同。

2)另一种方法是将after/ before视为sort列的最后一次看到的值(这样将传递实际的(混淆的)值):

SELECT * FROM ORDER BY timestamp WHERE timestamp > $after LIMIT $first

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

例如,您将创建如下的分页结果:

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类生成模式:

GraphQLSchema schema = new GraphQLSchemaGenerator()
       .withOperationsFromSingleton(new BookService())
       .generate();
GraphQL graphQL = GraphQLRuntime.newGraphQL(schema).build();

并执行查询:

ExecutionResult result = graphQL.execute("{books(first:10, after:\"20\") {" +
                "   pageInfo {" +
                "       hasNextPage" +
                "   }," +
                "   edges {" +
                "       cursor, node {" +
                "           title" +
                "}}}}");

但是,再次重申, 如果您不使用Relay,那么实际上就不需要太复杂
。如果您的存储设备自然支持基于游标的分页,请继续使用。如果不是,则只需使用简单的limit /
offset参数并返回一个列表,然后忘记连接规范。创建它是为了使Relay能够在各种情况下自动管理分页,因此如果您不使用Relay和/或具有基于游标的分页的DB,则几乎总是完全无效。



 类似资料:
  • 我正在试验graphql,并使用graphql瑜伽创建了一个简单的服务器。我的Mongoose产品模型查询我的数据库,两个解析器按预期返回数据。到目前为止,一切顺利,我很高兴这是多么容易。然而,我有一个问题。我正在尝试添加一种方法来对来自graphQL的结果进行分页。 1) 向查询类型添加限制参数。 2) 通过解析器中的参数访问参数 我可以在我的解析器中使用args.limit参数并使用它来改变M

  • 如何使用 Graphql SPQR 库实现 GraphQL 的订阅功能?

  • 有没有一种在颤振中实现GraphQL的方法?我试图用JSON对象中的查询和变量对象进行API调用。 类型_InternalLinkedHashMap不是类型转换中类型String的子类型

  • 我是graphql新手,使用官方graphql发现了2个java实现:https://www.graphql-java.com/documentation/v10/ 和 https://github.com/graphql-java-kickstart/graphql-java-tools 比如在java中实现graphql有什么不同?

  • AWS Lambda 上可以运行不同的语言,提供不同语言的运行环境。这也就意味着,它不仅可以跑 Express 来提供一个 RESTful API,它也可以运行各式各样的 Node.js 库,比如说 GraphQL。 GraphQL是一种API查询语言,是一个对自定义类型系统执行查询的服务端运行环境。我们可以编写一个使用 GraphQL 编写一个查询: { me { name }

  • 问题内容: 我需要访问以获得有关某个存储库的一些数据。以下命令很好用 现在,我需要调用相同的名称来操纵输出。这是我尝试过的代码, 当我调试代码时,它向我显示此错误, HttpResponseProxy {HTTP / 1.1 400错误的请求[服务器:GitHub.com,日期:2017年2月3日,星期五,格林尼治标准时间12:14:58,内容类型:application / json; char