过滤嵌套字段或将类型映射到查询

时间:2019-04-10 20:42:32

标签: java spring-boot graphql graphql-java graphql-spqr

打扰一下可能很基本的问题。我已经使用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);
}

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

实现“按名称过滤”之类的东西时,我想这也会很有用。

1 个答案:

答案 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