Dynamic 如何获取通用sObject中的字段列表?
我正在尝试构建一个查询生成器,其中sObject结果可以包含不确定数量的字段。我正在使用结果构建一个动态表,但我无法找到一种方法来读取查询中字段列表的sObject 我知道如何使用GetDescripte信息获取所有字段的列表,但查询可能不包含所有这些字段Dynamic 如何获取通用sObject中的字段列表?,dynamic,salesforce,visualforce,soql,Dynamic,Salesforce,Visualforce,Soql,我正在尝试构建一个查询生成器,其中sObject结果可以包含不确定数量的字段。我正在使用结果构建一个动态表,但我无法找到一种方法来读取查询中字段列表的sObject 我知道如何使用GetDescripte信息获取所有字段的列表,但查询可能不包含所有这些字段 有什么方法可以做到这一点吗?假设您正在将查询构建为一个字符串,因为它是动态的,所以您不能在描述信息中的字段中循环,然后在查询字符串上使用.contains(),查看是否请求了它吗?不是疯狂的优雅,但似乎是这里最简单的解决方案 进一步说,也许您
有什么方法可以做到这一点吗?假设您正在将查询构建为一个字符串,因为它是动态的,所以您不能在描述信息中的字段中循环,然后在查询字符串上使用
.contains()
,查看是否请求了它吗?不是疯狂的优雅,但似乎是这里最简单的解决方案
进一步说,也许您在字符串列表或类似列表中选择了字段列表,您可以直接使用该列表?不确定这是否正是您想要的,但类似于此
public list<sObject> Querylist {get; set;}
如果用户在这些字段上搜索,请添加构建搜索所需的数量
if(searchParameter.field1__c != null && searchParameter.field1__c != '')
{
QueryString += ' field1__c like \'' + searchParameter.field1__c + '%\' and ';
}
if(searchParameter.field2__c != null && searchParameter.field2__c != '')
{
QueryString += ' field2__c like \'' + searchParameter.field2__c + '%\' and ';
}
移除最后一个和
QueryString = QueryString.substring(0, (QueryString.length()-4));
QueryString += ' limit 200';
将查询添加到列表中
for(Object sObject : database.query(QueryString))
{
Querylist.add(sObject);
}
要获取sObject中的字段列表,可以使用以下方法:
public Set<String> getFields(sObject sobj) {
Set<String> fieldSet = new Set<String>();
for (String field : sobj.getSobjectType().getDescribe().fields.getMap().keySet()) {
try {
a.get(field);
fieldSet.add(field);
} catch (Exception e) {
}
}
return fieldSet;
}
publicsetfields(sObject-sobj){
Set fieldSet=新集合();
for(字符串字段:sobj.getSobjectType().getdescription().fields.getMap().keySet()){
试一试{
a、 获取(字段);
fieldSet.add(字段);
}捕获(例外e){
}
}
返回字段集;
}
您应该针对您的上下文重构这种方法,但它是有效的。只要传入一个sObject,它就会返回一组字段名。我建议使用字段列表来创建查询和表。您可以将字段列表放入结果中,以便使用它的任何人都可以访问它。然后可以使用result.getFields()构造表,并使用result.getRows()检索数据
如果您试图处理一个无法控制的查询,则必须解析该查询以获得字段列表。但我不建议你试一下。它以难以理解的方式使代码复杂化。您签出Apex Lang了吗?它有很多设计良好的动态查询功能,您不必重新发明轮子。它是第一个查找大量此类实用程序代码的地方。如果sobjecttype是aggregateresult,您将如何执行此操作?
public Set<String> getFields(sObject sobj) {
Set<String> fieldSet = new Set<String>();
for (String field : sobj.getSobjectType().getDescribe().fields.getMap().keySet()) {
try {
a.get(field);
fieldSet.add(field);
} catch (Exception e) {
}
}
return fieldSet;
}
for (sObject obj : result.getRows()) {
for (String fieldName : result.getFields()) {
table.addCell(obj.get(fieldName));
}
}