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

Hybris 使用灵活的搜索读取集合类型数据,hybris,Hybris,如何使用灵活的搜索查看Hybris中以集合类型存储的数据列表 我在某个地方读到过,它存储为PKs,因此可以以某种方式解析它吗?“CollectionType基于Java Collection类。” CollectionType数据库字段的最大长度是有限的,因此可能会由于许多记录而截断其值。此外,CollectionTypes的值以CSV格式写入,而不是以规范化的方式写入。Hybris建议尽可能使用RelationType而不是CollectionType 集合如何存储值: 如果Collectio

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

我在某个地方读到过,它存储为PKs,因此可以以某种方式解析它吗?

“CollectionType基于Java Collection类。”

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

集合如何存储值:

  • 如果CollectionType包含原子类型,则值将作为二进制字段存储在数据库中
  • 如果CollectionType存储项目集合,则项目的主键(PK)将以字符串形式存储在数据库中(PK列表
  • 优势:

  • 由于一个CollectionType实例的所有值都存储为一个字段,因此读取和写入值的速度相当快,就像在单个数据库访问中一样(特别是使用缓存)
  • 缺点:

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

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

  • 它记录在灵活的搜索和收藏中

    你有订单和信用卡的情况。这是一个示例,其中collection元素类型有一个对保存集合的项目的引用(vouchercards作为订单的引用)

    那么,在元素和保持器之间就有了不带引用的情况。基于集合属性存储为PK列表的事实,您可以使用一些变通方法:

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

    您可以尝试以下方法。
    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}"");"
    

    看看这里:我测试了集合的查询(第二个),但它不工作。在items.xml supportedpaymentmodes中,修饰符search=“false”。不知道是我做错了smth,还是维基的查询错了。事实上,“搜索”属性doc说-->“定义此属性是否可通过FlexibleSearch进行搜索。根据hybris版本的不同,它可能会发生变化。无论如何,第二个例子不是最好的,因为不应该再使用集合了。欢迎使用SO!请确保下次你的答案排版正确。
    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}"");"
    
    **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} , '%' ) )
    }