通过数据库将数据包含在 impex 中
Inclusion of data via database in an impex
这是我的 impex:
INSERT_UPDATE ReferenceProductAttributeValue;leaf(code,name[lang=de])[unique=true];newvalue(pk)
我必须先输入 newvalue(pk) units.p_code="PCE"
的 pk ,我必须接受它来自我的数据库 e.Here 是我的查询,它在我的 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)
现在我不再有错误,但仍然没有我在新值中搜索到的 pk。有人能帮我吗?谢谢!
尝试使用代码
newvalue(code)[default='PCE']
所以我的解决方案是我制作了一个看起来像这样的翻译器(这仅适用于像我这样的初学者,也许是另一个解决方案但对我来说这就足够了,它确实有效。如果有更多经验的人喜欢要改进代码,请...):
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
解决方案取决于 newValue 的类型。
如果它的类型是 Unit,您可以通过一个或多个 Unit 类型的属性来引用它,这些属性唯一地标识该项目(例如代码):
newvalue(code)
如果它的类型更通用,比如 Item,您需要使用该类型的唯一属性。 Item 唯一的唯一属性是 PK。但是您不想通过 PK 引用您的单位。因此,您可以通过在属性前面加上您要引用的类型的类型代码来定义应该使用哪种类型:
newValue(Unit.code)
在完整的声明中,它看起来像这样:
INSERT_UPDATE ReferenceProductAttributeValue;leaf(code,name[lang=de][unique=true];newvalue(Unit.code);
;001:AGP-Grafikkarte;PCE;
您还可以使用 & 运算符引用之前在 impex 语句中使用的其他项目。 & 运算符定义引用。你在 header 中这样定义它们:
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;
这是我的 impex:
INSERT_UPDATE ReferenceProductAttributeValue;leaf(code,name[lang=de])[unique=true];newvalue(pk)
我必须先输入 newvalue(pk) units.p_code="PCE"
的 pk ,我必须接受它来自我的数据库 e.Here 是我的查询,它在我的 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)
现在我不再有错误,但仍然没有我在新值中搜索到的 pk。有人能帮我吗?谢谢!
尝试使用代码
newvalue(code)[default='PCE']
所以我的解决方案是我制作了一个看起来像这样的翻译器(这仅适用于像我这样的初学者,也许是另一个解决方案但对我来说这就足够了,它确实有效。如果有更多经验的人喜欢要改进代码,请...):
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
解决方案取决于 newValue 的类型。
如果它的类型是 Unit,您可以通过一个或多个 Unit 类型的属性来引用它,这些属性唯一地标识该项目(例如代码):
newvalue(code)
如果它的类型更通用,比如 Item,您需要使用该类型的唯一属性。 Item 唯一的唯一属性是 PK。但是您不想通过 PK 引用您的单位。因此,您可以通过在属性前面加上您要引用的类型的类型代码来定义应该使用哪种类型:
newValue(Unit.code)
在完整的声明中,它看起来像这样:
INSERT_UPDATE ReferenceProductAttributeValue;leaf(code,name[lang=de][unique=true];newvalue(Unit.code);
;001:AGP-Grafikkarte;PCE;
您还可以使用 & 运算符引用之前在 impex 语句中使用的其他项目。 & 运算符定义引用。你在 header 中这样定义它们:
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;