SAP Commerce Flexible Search查询Email/UID失败及相关疑问求助
SAP Commerce Flexible Search 查询问题解答
我是SAP Commerce新手,测试Flexible Search时部分查询正常:
1) Select * {User} SELECT {user.pk} FROM {User AS user} 2) SELECT {user.pk}, {ItemType} FROM {User AS user}
但查询email或originaluid时始终失败,尝试p_前缀也无效:
1) SELECT {email} FROM {User AS user} 2) SELECT {p_originaluid} FROM {User AS user}
报错信息:
cannot search unknown field 'TableField(name='p_email',langPK='null',type=User)' within type User unless you disable checking, infoMap=TypeInfoMap for type = 8796093939794 code = User superType = 8796093841490 itemTable = users UPTable = usersup LTableName = userslp PropsTable = userprops core fields = owner = [owner,OwnerPkString,class de.hybris.platform.util.ItemPropertyValue] modifiedtime = [modifiedtime,modifiedTS,class java.util.Date] itemtype = [itemtype,TypePkString,class de.hybris.platform.util.ItemPropertyValue] creationtime = [creationtime,createdTS,class java.util.Date] pk = [pk,PK,class de.hybris.platform.core.PK] unlocalized fields = consentreference = [consentReference,p_consentreference, class java.lang.String] description = [description,p_description, class java.lang.String]
问题1:为何能获取部分字段,却无法获取email、originaluid?
- Flexible Search中,
{字段名}语法引用的是SAP Commerce模型的属性名,不是数据库表的物理字段名。 - 从报错返回的
TypeInfoMap可以明确看到:User类型的核心字段、非本地化字段里根本没有email和originaluid这两个属性,直接查询自然会提示“未知字段”。 - 实际
email是Customer类型(User的子类型)的专属属性,originaluid通常属于Principal或特定业务扩展的属性,必须查询对应的子类型或扩展类型才能获取。 - 你尝试的
p_前缀是数据库字段的命名规则,Flexible Search用模型属性名时不需要加这个前缀,添加后会被识别成模型属性名,反而导致字段不存在。
问题2:查询语句SELECT TypePkString FROM {User AS user}中,TypePkString是数据库字段,为何无需加大括号?
- 这是Flexible Search的特殊语法规则:
- 用
{字段名}是引用模型定义的属性名,系统会自动映射到对应的数据库字段; - 直接写字段名(不加大括号)是直接引用数据库表的原生物理字段。
- 用
TypePkString是SAP Commerce所有Item类型对应的数据库表都会自带的原生字段(对应模型里的itemtype属性),直接写这个字段名就可以查询,不需要用模型属性的大括号格式。- 两种写法都是合法的,区别在于:用模型属性名的写法更贴合SAP Commerce的模型驱动设计,不受数据库字段变更影响;直接写数据库字段则是绕过模型映射,直接操作底层表。
内容的提问来源于stack exchange,提问作者user20819930
相关产品推荐
相关产品推荐

