如何通过他的variantKey找到ProductVariant?

时间:2018-02-06 11:36:24

标签: java commercetools sphere.io

在我的项目中,我现在需要从variantKey获取产品的变体,但我没有在JVM SDK中找到任何方法来执行此操作。 我尝试使用ProductByKeyGet方法来实现它,但是如果值对应于产品的根密钥,我只获取产品,但如果该值对应于variantKey,则它不会向我返回任何内容。

有没有人知道从VariantKey获取变体的任何方法?

提前致谢。 Miguel de la Hoz

2 个答案:

答案 0 :(得分:3)

为此,您需要使用Product Projection端点,在那里您可以查询具有变体" OR"用你想要的钥匙掌握变种。通过JVM SDK,您可以通过执行以下操作来实现:

  1. 为您想要的密钥构建QueryPredicate<EmbeddedProductVariantQueryModel>

    final String myKey = "foo";
    final QueryPredicate<EmbeddedProductVariantQueryModel> queryPredicate =
        QueryPredicate.of("key=\"" + myKey + "\"");
    
  2. 构建Function<ProductProjectionQueryModel, QueryPredicate<ProductProjection>>以查询主变体:

    final Function<ProductProjectionQueryModel, QueryPredicate<ProductProjection>> mvPredicateFunction = productQueryModel ->
        productQueryModel.masterVariant().where(queryPredicate);
    
  3. 构建Function<ProductProjectionQueryModel, QueryPredicate<ProductProjection>>以查询其余变体:

    final Function<ProductProjectionQueryModel, QueryPredicate<ProductProjection>> variantsPredicateFunction = productQueryModel ->
        productQueryModel.variants().where(queryPredicate);
    
  4. 将两个谓词与语义OR运算符组合以构建ProductProjectionQuery(在本例中为staged投影):

    final ProductProjectionQuery query = ProductProjectionQuery.ofStaged()
                                                               .withPredicates(productQueryModel -> mvPredicateFunction
                                                                   .apply(productQueryModel)
                                                                   .or(variantsPredicateFunction.apply(productQueryModel)));
    
  5. 执行请求:

    final PagedQueryResult<ProductProjection> requestStage = sphereClient.executeBlocking(query);
    
  6. 由于变体键是唯一的,因此您应该期望产生一个最终产品投影,如果有的话:

    final Optional<ProductProjection> optionalProductProjection = requestStage.head();
    
  7. 遍历生成的产品投影的所有(包括主变体)变体,以使用此键获取匹配的变体:

    final Optional<ProductVariant> optionalVariant = optionalProductProjection.flatMap(
        productProjection -> productProjection.getAllVariants().stream()
                                              .filter(productVariant -> myKey.equals(productVariant.getKey()))
                                              .findFirst());
    
  8. 更新: 步骤1-4也可以简化为:

        final String myKey = "foo";
        final QueryPredicate<ProductProjection> productProjectionQueryPredicate = QueryPredicate
            .of("masterVariant(key = \"" +  myKey + "\") OR variants(key = \"" + myKey + "\")");
        final ProductProjectionQuery query = ProductProjectionQuery.ofStaged().withPredicates(
            productProjectionQueryPredicate);
    

答案 1 :(得分:3)

今天我们发布了我们的JVM SDK版本1.29.0 - 我们添加了缺少的按键查询产品变体的支持(参见https://github.com/commercetools/commercetools-jvm-sdk/issues/1679)。 使用此版本,您可以以类型安全的方式编写查询:

String myKey = "foo";
ProductProjectionType projectionType = ProductProjectionType.CURRENT;

ProductProjectionQuery query =
    ProductProjectionQuery.of(projectionType)
         .withPredicates(product -> product.allVariants()
            .where(variant -> variant.key().is(myKey)));

希望这有帮助!