目前,我发现graphql-java库中没有对分页的现有支持。它确实有一些基本的中继支持,可以在其中创建一个connection,这是Facebook推荐的实现分页的方法。
这是帮助实现这一目标的方法。但是,由于没有文档,我发现很难理解这个函数是如何工作的。如果某人已经有了一个允许使用graphql库进行基本查询(如Add、delete、fetch等)的现有模型,那么他们是否可以分解他们添加分页支持的步骤呢?
发布于 2017-06-16 12:32:56
您甚至不需要中继连接来支持分页。您的查询可以简单地接受一个页码和大小(或限制/偏移量)作为参数,并返回一个已完成的列表。但是,如果您想要对例如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的继电器连接规范类型。
至于使用basic GraphQL的示例,您有一个简单的web应用程序这里。
连接规范很自然地适合支持基于游标的分页的数据存储,但在使用不同的分页样式时需要一些创造性。
1)如果希望使用简单的基于偏移量的分页,可以决定将after视为偏移量(意味着将传递一个数字),并将first视为限制:
SELECT * FROM ORDER BY timestamp OFFSET $after LIMIT $firstbefore和last也是一样,只是方向不同。
2)另一种方法是将after/before视为排序列的最后一个可见值(因此将传递一个实际(模糊)值):
SELECT * FROM ORDER BY timestamp WHERE timestamp > $after LIMIT $first我还建议您看看我的项目graphql和示例应用程序,这使得开发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 --实际上没有必要使变得过于复杂。如果您的存储自然支持基于游标的分页,请执行它。如果没有,只需使用简单的限制/偏移量参数并返回一个列表,然后忘记连接规范。创建它是为了使中继能够在各种情况下自动管理分页,所以如果不使用带有基于游标的分页的Relay和/或DB,则几乎总是会造成完全过度。
https://stackoverflow.com/questions/44574964
复制相似问题