你甚至不需要中继连接,以支持分页。您的查询可以简单地接受页码和大小(或限制/偏移量)作为参数并返回列表 - 完成。 但是,如果您希望中继连接例如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应用程序here。
我还建议你看看我的项目,graphql-spqr,an example app,这使得开发GraphQL API简单。
例如,你需要创建一个分页的结果是这样的:
public class BookService {
@GraphQLQuery(name = "books")
//make sure the argument names and types match the Relay spec
public Page 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 books = getBooksFromDB(first, offset);
Page bookPage = PageFactory.createOffsetBasedPage(books, totalBookCount, offset);
return bookPage;
}
}
还有许多其他的方法来创建一个Page实例,这只是最直接的一个。如果你不使用继电器
ExecutionResult result = graphQL.execute("{books(first:10, after:\"20\") {" +
" pageInfo {" +
" hasNextPage" +
" }," +
" edges {" +
" cursor, node {" +
" title" +
"}}}}");
但同样,真的没有必要:
你会再生成Java类的模式: GraphQLSchema schema = new GraphQLSchemaGenerator()
.withOperationsFromSingleton(new BookService())
.generate();
GraphQL graphQL = GraphQLRuntime.newGraphQL(schema).build();
并执行一个查询过于复杂的东西。如果您的存储自然支持基于光标的分页,请继续。如果没有,只需使用简单的limit/offset参数并返回一个列表,并忘记连接规范。它是为了让Relay在各种情况下自动管理分页而创建的,所以如果你不使用Relay,它几乎总是矫枉过正。