Почему graphql java запрашивает все поля в объекте, когда я прошу только несколько?
Я создал базовое приложение graphql-java с помощью стартера загрузки spring и использовал библиотеку graphql spqr для базы данных MSSQL с использованием Hibernate и Jpa.
У меня есть сущность под названием "Задача" с 5 полями. У меня есть простой репозиторий Jpa и простая служба Jpa, которая вызывает метод findAllTasks. Он отлично работает, но если я укажу, например, только одно поле для запроса с помощью graphiql, я могу увидеть в моем журнале SQL, что выполненная команда выбора запрашивает ВСЕ поля в моей сущности / таблице Task, а не то, которое я хочу. Ожидается ли это? Я думал, что 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 ответ
Вы должны различать ваш GraphQL API и вашу базу данных. Вы определили метод запроса GraphQL, который называетсяfindAllTasks
. Следовательно, когда вы вызываете этот запрос GraphQL с любым количеством полей, он вызывает реализацию метода Java.findAllTasks
.
Вы можете видеть, что реализация этого метода Java вызывает taskRepo.findAll()
. Таким образом, вы получите все данные из ваших задач в базе данных.
Затем GraphQL отфильтрует данные из задач, выбранных вашим методом Java, в соответствии с тем, что запрашивается в запросе GraphQL.
Вкратце, GraphQL отвечает за возврат только запрошенных вами полей, но ваша реализация отвечает за получение данных из базы данных.
Отказ от ответственности: я не эксперт по graphql-spqr, поэтому предстоящая информация может не работать в вашем случае (применительно к graphql-java).
Однако если вы чувствуете, что ваша реализация недостаточно эффективна (здесь мы действительно говорим об эффективности), вы можете изучить загрузчики данных.