我正在尝试构建一个查询构建器,其中sObject结果可以包含不确定数量的字段。我正在使用结果来构建动态表,但我无法找到一种方法来读取sObject以查找查询中的字段列表。
我知道如何使用getDescribe信息获取所有字段的列表,但查询可能不包含所有这些字段。
有办法做到这一点吗?
答案 0 :(得分:2)
大概你正在将查询构建为一个字符串,因为它是动态的,所以你不能只是遍历描述信息中的字段,然后在查询字符串上使用.contains()
来查看它是否是被请求了?不是疯狂优雅,但似乎是最简单的解决方案。
进一步说,也许您在字符串列表或类似字段中选择了字段列表,您可以使用该列表吗?
答案 1 :(得分:0)
不确定这是不是你想要的,但不是这样的吗?
public list<sObject> Querylist {get; set;}
定义搜索字符串
string QueryString = 'select field1__c, field2__c from Object where';
如果用户搜索这些字段,则添加尽可能多的内容以构建搜索
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);
}
答案 2 :(得分:0)
要获取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;
}
你应该为你的上下文重构这个方法,但是它有效。只需传入一个sObject,它就会返回一组字段名称。
答案 3 :(得分:0)
我建议使用字段列表来创建查询和表。您可以将结果列表放在结果中,以便任何使用它的人都可以访问它。然后,您可以使用result.getFields()构造表,并使用result.getRows()检索数据。
for (sObject obj : result.getRows()) {
for (String fieldName : result.getFields()) {
table.addCell(obj.get(fieldName));
}
}
如果您尝试使用不受控制的查询,则必须解析查询以获取字段列表。但我不建议尝试这样做。它以难以理解的方式使代码复杂化。