Фильтрация вложенных полей или сопоставление типов с запросами - PullRequest
2 голосов
/ 10 апреля 2019

Извините, возможно, основной вопрос.Я использовал GraphQL SPQR для реализации выборки DTO продукта, например так:

@GraphQLQuery(name = "products")
public Page<ProductEntity> getProducts(@GraphQLArgument(name = "count", defaultValue = "10") int count, @GraphQLArgument(name = "offset") int offset) {
    Pageable queryPage = PageRequest.of(offset, count);
    return productRepository.findAll(queryPage);
}

Обратите внимание, что с этим запросом я перелистываю свое хранилище данных.

Мои DTO установленытаким образом, что я могу запросить следующим образом:

products(count: 10, offset: 0) {
    store {
        products /* attempting to query using the count and offset parameters here is invalid*/ {
            productName
        }
    }
}

Под вторым типом (магазин), я снова получаю список продуктов.Как я могу сказать GraphQL для получения второго, вложенного списка продуктов таким же образом, как он будет получать первый список продуктов?

Я представляю себе возможность привязать GraphQLQuery к моему ProductEntityDAO класс или что-то вроде этого, так что выборки для этого типа могут разрешаться одинаково.

Ваша помощь приветствуется.

РЕДАКТИРОВАТЬ:

Спасибо, Какао.Решение сработало идеально, и у меня было требование решить эту проблему для общего случая «сущность, у которой есть продукты».

Для этого я определил интерфейс для сущности моего продукта, который выглядит следующим образом:

@GraphQLInterface(name = "hasProducts", implementationAutoDiscovery = true)
public interface ProductEdge {
    Collection<ProductEntity> getProducts();
}

Затем я заставляю свою сущность, имеющую соединение со списком продуктов, извлекать ее обобщенным способом, реализуя этот интерфейс на моих сущностях, которые должны сделать это:

public class CommercialPartnerEntity implements ProductEntity.ProductEdge

И в моем репозитории:

@Query("select child from CommercialPartnerEntity p inner join p.products child where p = :parent")
@GraphQLQuery(name = "relatedProducts")
Page<ProductEntity> findBy(@Param("parent") ProductEntity.ProductEdge parent, Pageable pageable);

Позволяя мне в моем сервисе делать такие вещи:

@GraphQLQuery(name = "productsList")
public Page<ProductEntity> getProducts(@GraphQLContext ProductEntity.ProductEdge hasProductsEntity, @GraphQLArgument(name = "count", defaultValue = "10") int count, @GraphQLArgument(name = "offset") int offset) {
    Pageable queryPage = PageRequest.of(offset, count);
    return productRepository.findBy(hasProductsEntity, queryPage);
}

И соответственно я определил свой преобразователь для любого конкретного типа в обобщенномпуть.Хотелось бы услышать мысли других людей о решении.

При реализации таких вещей, как «фильтр по имени», я думаю, это тоже будет очень полезно.

1 Ответ

1 голос
/ 11 апреля 2019

Если я вас правильно понял, вы ищете способ вызова внешнего метода для разрешения store.products. Если это так, это легко сделать, используя @GraphQLContext.

Вы можете, например, сделать что-то вроде:

//Any class with queries
public class ProductService {

    @GraphQLQuery(name = "products")
    public Page<ProductEntity> getProducts(@GraphQLContext Store store, @GraphQLArgument(name = "count", defaultValue = "10") int count, @GraphQLArgument(name = "offset") int offset) {
        //your logic here, maybe delegating to the existing getProducts method
    }
}

Если Store уже имеет getProducts, вы можете @GraphQLIgnore, но не обязательно.

Если вы спрашиваете, как передать те же аргументы products внутри store.products, проверьте мой ответ здесь . Вы можете ввести ResolutionEnvironment, используя @GraphQLEnvironment ResolutionEnvironment, и оттуда вы можете получить DataFetchingEnvironment, если вам это нужно.

...