Почему graphql java запрашивает все поля в объекте, когда я прошу только несколько?

Я создал базовое приложение graphql-java с стартером весенней загрузки и использовал библиотеку graphql spqr с базой данных MSSQL с использованием Hibernate и Jpa.

У меня есть сущность под названием «Задача» с 5 полями. У меня есть простой репозиторий Jpa и простая служба Jpa, которая вызывает метод findAllTasks. Он отлично работает, но если я укажу, например, только одно поле для запроса с помощью graphiql, я могу увидеть в моем журнале SQL, что выполненная команда select запрашивает ВСЕ поля в моей сущности / таблице 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_


person J-man    schedule 20.03.2020    source источник


Ответы (1)


Вы должны различать ваш GraphQL API и вашу базу данных. Вы определили метод запроса GraphQL, который называется findAllTasks. Следовательно, когда вы вызываете этот запрос GraphQL с любым количеством полей, он вызывает реализацию метода Java findAllTasks.

Вы можете видеть, что реализация этого метода Java вызывает taskRepo.findAll(). Таким образом, вы получите все данные из ваших задач в базе данных.

Затем GraphQL отфильтрует данные из задач, выбранных вашим методом Java, в соответствии с тем, что запрашивается в запросе GraphQL.

Вкратце, GraphQL отвечает за возврат только запрошенных вами полей, но ваша реализация отвечает за получение данных из базы данных.

Отказ от ответственности: я не являюсь экспертом по graphql-spqr, поэтому следующая информация может не работать в вашем случае (применительно к graphql-java ).

Если вы чувствуете, что ваша реализация недостаточно эффективна (здесь мы действительно говорим об эффективности), вы можете изучить загрузчики данных.

person D. Lawrence    schedule 02.04.2020
comment
Спасибо за ответ! В этом есть смысл. Я предполагаю, что проблема будет существовать в graphql-java сама по себе и с spqr. Как вы сказали, похоже, именно так hibernate / JPA получает данные из реализации в моем Java-коде, что имеет смысл. Я мало что знаю о загрузчиках данных, но обязательно проверю. - person J-man; 02.04.2020