为什么我只查询几个字段,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 数据库 利用 Hibernate 和 Jpa 。
我有一个名为 "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。
我创建了一个基本的 graphql-java 应用程序,带有 spring boot starter 并使用 graphql spqr 库针对 MSSQL 数据库 利用 Hibernate 和 Jpa 。
我有一个名为 "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。