graphql java如何使用_GraphQL:如何用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应用程序here。

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

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

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

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

2)另一种方法是将after / before视为排序列的最后一次看到的值(因此将传递实际(模糊处理的)值):

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

我还建议您使用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实例,这只是最直接的实例。

然后,您将从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能够在各种场景下自动管理分页,因此如果你不使用Relay和/或基于光标的分页DB,那么它几乎总是有点过分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值