筛选嵌套字段,或将类型映射到查询



请原谅可能的基本问题。我已经使用 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);
}

因此,我以通用方式为任何特定类型定义了解析器。很想听听其他人对解决方案的想法。

在实现"按名称过滤"之类的东西时,我想这也非常有用。

如果我没猜错,您正在寻找一种调用外部方法来解析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,请在此处查看我的答案。您可以使用@GraphQLEnvironment ResolutionEnvironment注入ResolutionEnvironment,如果需要,您可以从那里获得DataFetchingEnvironment

相关内容

  • 没有找到相关文章

最新更新