Почему graphql java запрашивает все поля в сущности, когда я запрашиваю только несколько? - PullRequest
0 голосов
/ 20 марта 2020

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

У меня есть объект под названием «Задача» с 5 полями. У меня есть простой репозиторий Jpa и простой сервис Jpa, который вызывает метод "findAllTasks". Это прекрасно работает, но если я укажу, например, только одно поле для запроса с graphiql, я смогу увидеть в моем журнале SQL, что выполненная команда выбора запрашивает ВСЕ поля в моей сущности / таблице Task, а не одно Я хочу. Это ожидается? Я думал, что GraphQl только выбирает поля, которые вы указываете в команде запроса?

Вот мой код:

Entity

@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 Ответ

1 голос
/ 02 апреля 2020

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...