2

我使用spring boot 启动器创建了一个基本的graphql-java应用程序,并使用graphql spqr库针对使用HibernateJpa的MSSQL 数据库

我有一个名为“任务”的实体,有 5 个字段。我有一个简单的 Jpa 存储库和一个调用“findAllTask​​s”方法的简单 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_

4

1 回答 1

3

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

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

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

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

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

如果您觉得您的实现不够高效(这里我们真正谈论的是效率),您可以查看dataloaders

于 2020-04-02T08:37:13.023 回答