Apex中SOQL使用两种String数组查询结果不一致原因求解
问题背景
有一个名为boatNames__mdt的自定义元数据对象,通过两种方式获取Picklist值存入String数组,使用相同逻辑的SOQL查询时返回结果不一致。
实现方式
第一种:从自定义元数据文本区域字段取值
Map<String, boatNames__mdt> mapEd = boatNames__mdt.getAll(); string boatTypes = (string) mapEd.values()[0].BoatPick__c; // BoatPick__c是一个文本区域字段(示例值:'Yacht, Sailboat') string[] btWRAP = new string[]{}; btWRAP.addAll(boatTypes.normalizeSpace().split(','));
第二种:从Picklist字段描述中取值
string[] strL = new string[]{}; Schema.DescribeFieldResult dfr = Schema.SObjectType.boatNames__mdt.fields.BoatTypesPicklist__c; // BoatTypesPicklist__c是一个picklist字段(可选值:'Yacht, Sailboat') PicklistEntry[] picklistValues = dfr.getPicklistValues(); for (PicklistEntry pick : picklistValues){ strL.add((string) pick.getLabel()); }
SOQL查询代码
Map<Id, BoatType__c> boatMap = new Map<Id, BoatType__c> ([Select Id, Name from BoatType__c Where Name in :btWRAP]);
问题现象
绑定btWRAP数组执行SOQL无记录返回,绑定strL数组执行则可以正常返回记录。
原因分析
- 核心差异是
btWRAP数组的元素存在多余的首尾空格:文本区域字段示例值为Yacht, Sailboat,调用split(',')分割后,得到的数组元素为['Yacht', ' Sailboat'],第二个元素开头存在空格。normalizeSpace()仅会将字符串首尾的空格以及内部连续的多个空格替换为单个空格,不会清除逗号和后续内容之间的单个分隔空格。 strL数组的元素来自Picklist选项的Label,本身没有多余的前后空格,和BoatType__c的Name字段值完全匹配,因此可以正常返回结果。- Salesforce SOQL的字符串匹配为精确匹配,空格、大小写不一致都会导致匹配失败,因此带空格的
btWRAP元素无法匹配到对应记录。
修复方案
修改第一种方法的分割逻辑,分割后对每个元素调用trim()清除前后空格,或者直接用正则匹配分割逗号及后续的任意空格:
// 方案1:分割后逐个trim for(String s : boatTypes.normalizeSpace().split(',')){ btWRAP.add(s.trim()); } // 方案2:用正则分割 btWRAP.addAll(boatTypes.normalizeSpace().split(',\\s*'));
内容的提问来源于stack exchange,提问作者Ionut Sultana
相关产品推荐
相关产品推荐

