为什么GraphQLJava查询实体中的所有字段,而我只要求几个字段?

为什么GraphQLJava查询实体中的所有字段,而我只要求几个字段?,graphql,graphql-java,graphql-spqr,graphql-spring-boot,Graphql,Graphql Java,Graphql Spqr,Graphql Spring Boot,我用spring boot starter创建了一个基本的graphql java应用程序,并在使用Hibernate和Jpa的MSSQL数据库上使用graphql spqr库 我有一个名为Task的实体,有5个字段。我有一个简单的Jpa存储库和一个调用findAllTasks方法的简单Jpa服务。它工作得很好,但是如果我只指定一个字段来使用graphiql进行查询,我可以通过SQL日志看到执行的select命令正在查询任务实体/表中的所有字段,而不是我想要的字段。这是预期的吗?我以为graph

我用spring boot starter创建了一个基本的graphql java应用程序,并在使用Hibernate和Jpa的MSSQL数据库上使用graphql spqr库

我有一个名为Task的实体,有5个字段。我有一个简单的Jpa存储库和一个调用findAllTasks方法的简单Jpa服务。它工作得很好,但是如果我只指定一个字段来使用graphiql进行查询,我可以通过SQL日志看到执行的select命令正在查询任务实体/表中的所有字段,而不是我想要的字段。这是预期的吗?我以为graphql只选择您在查询命令中指定的字段

这是我的密码:

实体

@实体 @吸气剂 @塞特 @AllArgsConstructor @诺尔格构装师 @建筑商 公开课任务{ @身份证 @GeneratedValuestrategy=GenerationType.IDENTITY 公共长id; @纵队 公共字符串描述; @纵队 公共LocalDateTime-createdOn; @纵队 公共LocalDateTime修饰符; @纵队 公共字符串所有者; } 存储库

@存储库 公共接口任务库扩展了JpaRepository{} 服务

@GraphQLApi @服务 公共类任务服务{ 私有TaskRepository taskRepo; @自动连线 公共TaskServiceTaskRepository taskRepo{ this.taskRepo=taskRepo; } @图形查询 公共列表findAllTasks{ 返回taskRepo.findAll; } } 在graphiql中运行以下命令时:

query {
    findAllTasks {
        id
    }
}
我从日志中获得以下SQL语句:

选择task0\u.id作为Task1\u 1\u 0\u。task0\u0.desc为Task1\u 2\u 0,task0\u0.createdOn为Task1\u 3\u 0,task0\u0.modifiedOn为Task1\u 4\u 0,task0\u0.owner为task0中的Task1\u 4\u 0_
您必须区分GraphQLAPI和数据库。您定义了一个名为findAllTasks的查询方法GraphQL。因此,当您使用任意数量的字段调用此GraphQL查询时,它将调用Java方法实现findAllTasks

您可以看到,这个Java方法的实现调用taskRepo.findAll。所以,您将从数据库中的任务中获取所有数据

然后,GraphQL将过滤Java方法获取的任务中的数据,以匹配GraphQL查询中的请求

简而言之,GraphQL负责返回您请求的字段,但您的实现负责从数据库获取数据

免责声明:我不是graphql spqr的专家,因此即将发布的信息可能不适用于您的情况,因为它应用于graphql java


但是,如果您觉得您的实现效率不够,我们这里真正讨论的是效率,那么您可以研究一下。

您必须区分GraphQL API和数据库。您定义了一个名为findAllTasks的查询方法GraphQL。因此,当您使用任意数量的字段调用此GraphQL查询时,它将调用Java方法实现findAllTasks

您可以看到,这个Java方法的实现调用taskRepo.findAll。所以,您将从数据库中的任务中获取所有数据

然后,GraphQL将过滤Java方法获取的任务中的数据,以匹配GraphQL查询中的请求

简而言之,GraphQL负责返回您请求的字段,但您的实现负责从数据库获取数据

免责声明:我不是graphql spqr的专家,因此即将发布的信息可能不适用于您的情况,因为它应用于graphql java


但是,如果您觉得您的实施效率不够,我们这里真正讨论的是效率,您可以进行调查。

感谢您的回复!这是有道理的。我想GraphQLJava本身和spqr都会存在这个问题。正如您所说,这似乎是hibernate/JPA在我的Java代码中从实现中获取数据的方式,这很有意义。我对数据加载器了解不多,但我一定会去看看。谢谢你的回复!这是有道理的。我想GraphQLJava本身和spqr都会存在这个问题。正如您所说,这似乎是hibernate/JPA在我的Java代码中从实现中获取数据的方式,这很有意义。我对数据加载器了解不多,但我一定会去看看。