打扰一下可能很基本的问题。我已经使用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
类或诸如此类的功能,以便针对该类型的访存都可以以相同的方式解决。
感谢您的帮助。
编辑:
感谢Kaqqao。该解决方案效果很好,对于一般情况下的“有产品的实体”,我必须解决此问题。
为此,我在产品实体上定义了一个界面,如下所示:
@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);
}
因此,我已经以通用的方式为任何特定类型定义了我的解析器。很想听听其他人对解决方案的想法。
实现“按名称过滤”之类的东西时,我想这也会很有用。
答案 0 :(得分: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
的相同参数,请检查我的答案here。您可以使用ResolutionEnvironment
注入@GraphQLEnvironment ResolutionEnvironment
,然后从那里获得DataFetchingEnvironment
。