Извините, возможно, основной вопрос.Я использовал 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);
}
И соответственно я определил свой преобразователь для любого конкретного типа в обобщенномпуть.Хотелось бы услышать мысли других людей о решении.
При реализации таких вещей, как «фильтр по имени», я думаю, это тоже будет очень полезно.