当前位置: 首页 > 知识库问答 >
问题:

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

晋俊贤
2023-03-14

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

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

这是我的代码:

实体

@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Task {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long id;

    @Column
    public String desc;

    @Column
    public LocalDateTime createdOn;

    @Column
    public LocalDateTime modifiedOn;

    @Column
    public String owner;
}

存储库

@Repository
public interface TaskRepository extends JpaRepository<Task, Long> {}

服务

@GraphQLApi
@Service
public class TaskService {
    private TaskRepository taskRepo;

    @Autowired
    public TaskService(TaskRepository taskRepo) {
        this.taskRepo = taskRepo;
    }

    @GraphQLQuery
    public List<Task> findAllTasks() {
        return taskRepo.findAll();
    }
}

当我在graphiql中运行以下命令时:

query {
    findAllTasks {
        id
    }
}

我从日志中得到以下SQL语句:

select task0_.id as Task1_1_0_. task0_.desc as Task1_2_0, task0_.createdOn as Task1_3_0, task0_.modifiedOn as Task1_4_0, task0_.owner as Task1_4_0 from Task as task0_

共有1个答案

龚跃
2023-03-14

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

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

然后,GraphQL将从Java方法获取的任务中过滤数据,以匹配GraphQL查询中询问的内容。

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

免责声明:我不是graphql spqr的专家,因此接下来的信息可能不适用于您的情况(因为它适用于graphql java)。

但是,如果您觉得您的实现不够高效(这里我们真正讨论的是效率),您可以研究数据加载器。

 类似资料:
  • 我有以下Hibernate表: 这是Createquery导致的错误: 'org.hibernate.queryException:查询指定了联接提取,但提取的关联的所有者不在选择列表中[fromelement{explicit,not a collection join、fetch join、fetch non-lazy properties,classalias=e,role=myprojec

  • 我有两种型号: 模式: GraphQL的目标之一是性能。为此,GraphQL必须通过GraphQL请求(例如:GraphiQL)仅向数据库请求所请求的字段 如果我请求以下查询: 石墨烯-django库生成以下SQL: 它得到了模型的所有字段!与API Rest问题相同,不符合GraphQL指南。 如果我从模型中请求字段,我希望查询是: 外键如何解决这个问题?

  • 我有两张有相同字段桌子。(请不要责怪设计)。 以下仅针对示例架构 表A ID 姓名 电话 键 所以,我想在一次查询中从满足条件“keys”的表A或表B中查询id、name,返回字段只有“id”和“name”,不管它是从表A或表B 中查询 从TABELA中选择a.id、a.name、b.id、b.name作为a,TABLEB作为b,其中a.keys=“1”或b.keys=“1” 它将重复的id、na

  • 我有一个带有搜索功能的spring MVC应用程序。 虚拟查询生成器 现在,这个虚拟查询生成器不支持通配符或任何其他类型。我正在学习Apache Lucene Query API(还添加了Lucene Core-7.7.1来进行项目)和一大堆教授如何使用不同类型的查询实现(TermQuery、PhraseQuery、BooleanQuery等)的文章,但这根本没有意义。最后,我仍然手动构建查询。

  • 我对使用Solr是新手,我制作了一个新的核心并复制了默认的模式。xml到conf文件夹。我所做的更改非常微不足道。 如您所见,我将字段设置为存储=false。根据我的理解,现在进行查询搜索时不应该显示字段。但这没有发生。我尝试重新启动solr实例,并再次进行查询以索引文件。 根据Solr Wiki,这应该已经为我的文件重新编制了索引。但是,当我再次运行查询时,仍然可以看到Id。 返回的文档示例(这