Dynamic 如何获取通用sObject中的字段列表?

Dynamic 如何获取通用sObject中的字段列表?,dynamic,salesforce,visualforce,soql,Dynamic,Salesforce,Visualforce,Soql,我正在尝试构建一个查询生成器,其中sObject结果可以包含不确定数量的字段。我正在使用结果构建一个动态表,但我无法找到一种方法来读取查询中字段列表的sObject 我知道如何使用GetDescripte信息获取所有字段的列表,但查询可能不包含所有这些字段 有什么方法可以做到这一点吗?假设您正在将查询构建为一个字符串,因为它是动态的,所以您不能在描述信息中的字段中循环,然后在查询字符串上使用.contains(),查看是否请求了它吗?不是疯狂的优雅,但似乎是这里最简单的解决方案 进一步说,也许您

我正在尝试构建一个查询生成器,其中sObject结果可以包含不确定数量的字段。我正在使用结果构建一个动态表,但我无法找到一种方法来读取查询中字段列表的sObject

我知道如何使用GetDescripte信息获取所有字段的列表,但查询可能不包含所有这些字段


有什么方法可以做到这一点吗?

假设您正在将查询构建为一个字符串,因为它是动态的,所以您不能在描述信息中的字段中循环,然后在查询字符串上使用
.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));
    }
}