0

这是我的impex:

    INSERT_UPDATE ReferenceProductAttributeValue;leaf(code,name[lang=de])[unique=true];newvalue(pk)

我必须首先输入newvalue(pk)pkunits.p_code="PCE"我必须从我的数据库 e 中获取它。这是我的查询,它在我的 MySQL 中完美运行:

      SELECT `units`.`PK` FROM `my_schema`.`units` WHERE `units`.`p_code`="PCE";

我已经尝试过这个:

    INSERT_UPDATE ReferenceProductAttributeValue;leaf(code,name[lang=de])[unique=true];newvalue(pk)
          ;001:Antiviren-Software (Client-Betriebssystem);
   "#% 
      impex.initDatabase( <myDburl>, <myUser>, <myPassword>, <MyDriver.class>);"
   "#% 
      impex.includeSQLData( 
      "" SELECT ""+
      "" units.PK ""+"" FROM my_schema.units ""+
      "" WHERE ""+
      "" units.p_code ='PCE'""
      );"

还有这个:

    INSERT_UPDATE ReferenceProductAttributeValue;leaf(code,name[lang=de])[unique=true];newvalue(pk)
                  ;001:Antiviren-Software (Client-Betriebssystem);
    "#%
     import  de.hybris.platform.servicelayer.search.FlexibleSearchQuery;
     flexibleSearchService = Registry.getApplicationContext().getBean(""flexibleSearchService"");
     query = "" SELECT {units.PK} FROM {my_schema.units} WHERE {units.p_code} LIKE '%PCE%' "";
     flexibleSearchQuery = new FlexibleSearchQuery(query);
     resultIterator = flexibleSearchService.search(flexibleSearchQuery).getResult().iterator();"

但它没有用。有人可以给我一个提示吗?

新尝试:

     INSERT_UPDATE ReferenceProductAttributeValue;newvalue(pk);leaf(code,name[lang=de])[unique=true]
     #% beforeEach:
     #% import de.hybris.platform.core.model.product.UnitModel;
     #% import de.hybris.platform.servicelayer.search.FlexibleSearchQuery;
     #% import de.hybris.platform.jalo.flexiblesearch.* ;
     #% import de.hybris.platform.core.Registry;
     #% flexibleSearchService = Registry.getApplicationContext().getBean("flexibleSearchService");
     #% query = "SELECT {" + UnitModel.PK + "} FROM {" + UnitModel._TYPECODE + "} WHERE {" + UnitModel.CODE + "} = 'PCE' ";
     #% flexibleSearchQuery = new FlexibleSearchQuery(query);
     #% resultIterator = flexibleSearchService.search(flexibleSearchQuery).getResult().iterator().next();
     #% beforeEach: end \
     ;001:Antiviren-Software (Client-Betriebssystem)

现在我不再有错误,但仍然没有我在 newvalue 中搜索的 pk。有人能帮我吗?谢谢!

4

3 回答 3

1

用代码试试

newvalue(code)[default='PCE']
于 2018-07-24T12:58:02.823 回答
0

解决方案取决于 newValue 的类型。

如果它的类型是 Unit,您可以通过一个或多个 Unit 类型的属性来引用它,这些属性唯一地标识这个项目(例如代码):

newvalue(code)

如果它的类型更通用,如 Item,则需要使用该类型的唯一属性。Item 的唯一独特属性是 PK。但是您不想按 PK 引用您的 Unit。因此,您可以通过在属性前面加上要引用的类型的类型代码来定义应使用的类型:

newValue(Unit.code)

在完整的声明中,它看起来像这样:

INSERT_UPDATE ReferenceProductAttributeValue;leaf(code,name[lang=de][unique=true];newvalue(Unit.code); 
;001:AGP-Grafikkarte;PCE;

您还可以使用 & 运算符引用之前在 impex 语句中使用的其他项目。& 运算符定义引用。您在标题中定义它们,如下所示:

INSERT_UPDATE Unit;code[unique=true];$unitRef;
;pieces;PIECES_REF;
;cm;CM_REF;

然后您可以稍后使用该引用来引用一个值:

INSERT_UPDATE ReferenceProductAttributeValue;leaf(code,name[lang=de][unique=true];newvalue(&unitRef); 
;001:AGP-Grafikkarte;PIECES_REF;
于 2018-08-06T08:45:04.517 回答
-2

所以我的解决方案是我制作了一个看起来像这样的翻译器(这仅适用于像我这样的其他初学者,也许也是另一个解决方案,但对我来说这已经足够了,它确实有效。如果有更多经验的人喜欢改进代码,请 ... ):

   public class UnitByCodeTranslator extends AbstractSpecialValueTranslator
{
 ...

/*
 *
 * @see de.hybris.platform.impex.jalo.translators.AbstractSpecialValueTranslator#performImport(java.lang.String,
 * de.hybris.platform.jalo.Item)
 */
@Override
public void performImport(final String cellValue, final Item item) throws ImpExException
{
            if ((item instanceof ReferenceProductAttributeValue))
    {
    final ReferenceProductAttributeValueModel referenceProdAttVal = (ReferenceProductAttributeValueModel) modelService.get(item.getPK());
    final String value = cellValue;
    final UnitModel unit = new UnitModel();
    try
    {
        unit.setCode(value);
        final UnitModel foundUnit = flexibleSearchService.getModelByExample(unit);
        referenceProdAttVal.setNewValue(foundUnit);
        modelService.save(referenceProdAttVal);
    }
    catch (final UnknownIdentifierException e)
    {
        LOGGER.warn("Could not find a Unit for this " + value);
    }
    catch (final AmbiguousIdentifierException e)
    {
        LOGGER.warn(e.toString());
        throw new UnresolvedValueException(e.toString());
    }
    }
}

....
} 

那么 impex 是这样的:

INSERT_UPDATE ReferenceProductAttributeValue;leaf(code,name[lang=de])[unique=true];@newvalue[translator=com.myextension.core.impex.translators.UnitByCodeTranslator]
;001:AGP-Grafikkarte;PCE
于 2018-07-31T07:19:04.087 回答