Фильтрация вложенных полей или сопоставление типов с запросами
Извините, возможно, основной вопрос. Я использовал 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
если тебе это нужно