Scr*_*tch 5 java pagination graphql graphql-java
目前,我看不到graphql-java库中对分页的支持.它确实有一些基本的中继支持,在这里,我们可以创建一个connection
Facebook推荐的分页实现方式.
这是帮助实现这一目标的方法.但是,由于没有文档,我发现很难理解这个函数是如何工作的.有人可以打破,走下台阶,他们将采取添加分页支持,如果他们已经有一个现成的模式,它允许像基本的查询Add
,delete
,fetch
等使用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());
Run Code Online (Sandbox Code Playgroud)
因此,您的BookConnection
类型符合中继连接规范.
至于基本GraphQL的示例,您可以在此处使用简单的Web应用程序.
连接规范自然适合支持基于光标的分页的数据存储,但在与不同的分页样式一起使用时需要一些创造力.
1)如果您希望使用简单的基于偏移的分页,您可以决定将其after
视为偏移(意味着将传递一个数字),并first
作为限制:
SELECT * FROM ORDER BY timestamp OFFSET $after LIMIT $first
Run Code Online (Sandbox Code Playgroud)
同样的,before
和last
,只是不同的方向.
2)另一种方法是将after
/ before
作为排序列的最后看到的值(因此将传递实际(模糊)值):
SELECT * FROM ORDER BY timestamp WHERE timestamp > $after LIMIT $first
Run Code Online (Sandbox Code Playgroud)
我还建议您使用示例应用程序查看我的项目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;
}
}
Run Code Online (Sandbox Code Playgroud)
还有许多其他方法可以创建Page
实例,这只是最直接的方法.
然后,您将从Java类生成一个模式:
GraphQLSchema schema = new GraphQLSchemaGenerator()
.withOperationsFromSingleton(new BookService())
.generate();
GraphQL graphQL = GraphQLRuntime.newGraphQL(schema).build();
Run Code Online (Sandbox Code Playgroud)
并执行查询:
ExecutionResult result = graphQL.execute("{books(first:10, after:\"20\") {" +
" pageInfo {" +
" hasNextPage" +
" }," +
" edges {" +
" cursor, node {" +
" title" +
"}}}}");
Run Code Online (Sandbox Code Playgroud)
但是,如果你不使用Relay,那么真的没有必要使事情过于复杂.如果您的存储自然支持基于游标的分页,请选择它.如果没有,只需使用简单的limit/offset参数并返回一个列表,并忘记连接规范.它的创建是为了使Relay能够在各种场景下自动管理分页,因此如果你没有使用Relay和/或带有基于光标的分页的DB,那么它几乎总是有点过分.
归档时间: |
|
查看次数: |
3310 次 |
最近记录: |