使用过Oracle或者Sql Server的朋友们都知道,语句【SELECT * FROM 表】可以查询整个表的项目,之前Salesforce是不支持此功能的,只能每个项目都写一遍,非常麻烦,随着2021年2月14日,Spring '21的正式上线,此类功能终于可以使用了,它就是今天要介绍的SOQL FIELDS()方法,前提是当前用户对于取得项目必须具备参照权限,
具体有以下三种方式,
·FIELDS(ALL) -取得所有项目
·FIELDS(CUSTOM) -取得所有自定义项目
·FIELDS(STANDARD) -取得所有标准项目
1.下面我们来简单测试一下FIELDS(STANDARD)
SELECT FIELDS(STANDARD) FROM Opportunity
2.FIELDS(CUSTOM)和标准项目组合起来,也是没有问题
SELECT Name,FIELDS(CUSTOM) FROM Opportunity LIMIT 200
3.制限问题
通过上边的SOQL语句我们看到使用【LIMIT 200】指定了件数限制,如果不指定件数的话又会怎样呢。
通过实验我们发现,不指定的情况下会发生下边错误,
「The SOQL FIELDS function must have a LIMIT of at most 200」
所以方法【FIELDS(ALL) 】和【FIELDS(CUSTOM)】是必须要指定件数限制的,
另外,方法【FIELDS(ALL) 】和【FIELDS(CUSTOM)】还有一个最大的制限就是在Apex中不支持使用,我们可以在匿名框中试一试。
实行结果:
「The SOQL FIELDS function is not supported with an unbounded set of fields in this API. 」
4.Apex内全项目查询方法
根据上边的实验结果,想必大家有点失望,在Apex内居然只可以使用FIELDS(STANDARD),如果把所有自定义项目都写一遍,即麻烦,看着也不美观,那么有没有解决方案呢,我们可以试着下边的做法。
首先做一个Apex共通类,用于取得指定Object的全部自定义项目,然后进行查询操作,如下
代码语言:javascript复制 public with sharing class GetAllCustomFieldsUtil {
public String getAllCustomFields(String objName) {
String customQuery = '';
String delimiter = ', ';
Schema.SObjectType objType = Schema.getGlobalDescribe().get(objName);
Map<String, sObjectField> fieldsMap = objType.getDescribe().fields.getMap();
for (String fieldName : fieldsMap.keySet()) {
if (fieldName.endsWith('__c')) {
customQuery = delimiter fieldName;
}
}
System.debug('query = ' customQuery);
return customQuery;
}
}