使用灵活搜索读取集合类型数据

时间:2017-04-08 18:51:12

标签: hybris

如何使用灵活搜索查看Hybris中收集类型中存储的数据列表?

我在某处读过它存储为PK,所以有可能以某种方式解析它吗?

4 个答案:

答案 0 :(得分:1)

" CollectionTypes基于Java Collection类。"

  

CollectionType数据库字段的最大长度是有限的,因此可能会因许多记录而截断其值。此外,CollectionTypes的值以CSV格式写入,而不是以标准化方式写入。 Hybris建议尽可能在CollectionType上使用RelationTypes。

集合如何存储值:

  1. 如果CollectionType包含AtomicTypes,则值将作为二进制字段存储在数据库中。
  2. 如果CollectionType存储了项目集合,那么项目'主键(PK)以字符串形式存储在数据库中( PK列表)。
  3. enter image description here

    优势:

    1. 由于一个CollectionType实例的所有值都存储为一个单独的字段,因此在单个数据库访问(特别是缓存)中读取和写入值非常快。
    2. 缺点:

      1. 如果集合包含大量PK,则字段值可能达到数据库实现的最大字段长度,并且条目可能会被截断。

      2. 由于数据库条目仅包含PK而不包含项目,因此无法直接对条目执行数据库搜索。相反,您需要通过Java在内存中运行搜索,这通常比直接在数据库上搜索更慢。

答案 1 :(得分:0)

FlexibleSearch Tips and Tricks - 灵活搜索和收藏中记录了

您有Orders和VoucherCard的情况。它是一个例子,其中集合元素类型具有对包含集合的项目的引用(作为订单引用的凭证卡)

SELECT {vc.PK}, {vc.price}
FROM
{
   Order AS o JOIN VoucherCard AS vc
   ON {vc.order}= {o.pk}
}
WHERE {o.PK} = ?order

然后你有一个案例,没有元素和持有人之间的参考。您可以根据以下事实使用一些解决方法:将集合属性存储为PK的列表:

SELECT {dm.code}, {pm.code}
FROM
{
   DeliveryMode AS dm JOIN PaymentMode AS pm
   ON {dm.supportedpaymentmodes} LIKE CONCAT( '%', CONCAT( {pm.PK} , '%' ) )
}

答案 2 :(得分:0)

您可以尝试以下方法。 vendorCodes是列表。

INSERT_UPDATE B2BCustomer;pk[unique=true];uid;vendorCodes
"#% impex.exportItemsFlexibleSearch(""select {c.pk},{c.uid},{c.vendorCodes} from {B2BCustomer as c} order by {c.pk}"");"

答案 3 :(得分:0)

**Use the below logic if there is any attribute relationship mapping between two tables:**

SELECT {vc.PK}, {vc.price}
FROM
{
   Order AS o JOIN VoucherCard AS vc
   ON {vc.order}= {o.pk}
}
WHERE {o.PK} = ?order

**Use the below if there is no mapping between two tables:**

SELECT {dm.code}, {pm.code}
FROM
{
   DeliveryMode AS dm JOIN PaymentMode AS pm
   ON {dm.supportedPaymentModeInternal} LIKE CONCAT( '%', CONCAT( {pm.PK} , '%' ) )
}