【问题标题】:GraphQL SPQR fetches all fields on the server sideGraphQL SPQR 获取服务器端的所有字段
【发布时间】:2021-07-13 07:10:17
【问题描述】:

我是 Spring Boot 新手,我刚开始使用 graphql-spqr 进行 Spring Boot,因为它可以轻松引导 Java 项目。

但是,据我了解,GraphQL 基本上允许从数据库中获取选定的字段。根据示例,我已经看到,graphql-spqr 库中的这种选择发生在客户端。有没有办法在客户端和服务器端都进行选择以加快查询速度?

我研究了 GraphQL 的 EntityGraph 示例,但它们主要是为涉及 JOIN 的复杂查询实现的。但是,对于 findAll()findById() 等简单查询,不存在任何内容。

我想使用findAll(),服务器只获取客户端请求的字段。我该怎么做?

【问题讨论】:

  • 这个实现完全由你自己决定,graphql 只是前端和后端之间的通信协议,将其视为一种 REST 端点,它可以让你制作不同类型的端点,但是每个端点如何更新由您决定
  • 继续讨论解决方案,您可能必须将列向下传递到 sql 级别,并且可能必须执行:在您的实现中从表等中选择 ,因为我不认为从代码到数据库层,有一个库可以为您做到这一点。你可以看看 Hasura,但我不确定它是否符合你的要求 :)
  • 明白。有没有办法根据 GraphQL 客户端请求的字段为 SQL 生成动态查询?
  • 我觉得一个叫做 hasura 的工具可能会有所帮助,但我只看过有关它的文章,并且自己从未尝试过......你可以看看它

标签: spring-boot graphql graphql-java graphql-spqr


【解决方案1】:

cmets 中所说的是正确的:GraphQL(因此也包括 SPQR,因为它只是一个连接架构的工具)对 SQL、数据库、JOIN 或其他任何东西一无所知。这是一个通信协议,其余的取决于你。 至于您的情况,您必须将子选择注入解析器并将其传递给 SQL。在最简单的情况下,它可能看起来像这样(在伪代码中):

public List<Book> books(@GraphQLEnvironment Set<String> fields) {
    //pass the requested field names further
    return database.query("SELECT " + fields + " FROM book");
}

您可以使用相同的注解注入ResolutionEnvironment,以防您需要完整的上下文。

【讨论】:

    猜你喜欢
    • 2020-08-23
    • 2017-06-24
    • 2020-02-28
    • 2021-10-27
    • 2020-08-19
    • 2017-11-22
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多