Фильтрация вложенных полей или сопоставление типов с запросами

Извините, возможно, основной вопрос. Я использовал 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 ответ

Решение

Если я вас правильно понял, вы ищете способ вызова внешнего метода для разрешения 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 если тебе это нужно

Другие вопросы по тегам