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

Why does graphql java query all fields in entity when I only ask for a few?

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

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

这是我的代码:

实体

@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_

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

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

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

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

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

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