Как получить список полей в универсальном sObject?
Я пытаюсь построить построитель запросов, где результат sObject может содержать неопределенное количество полей. Я использую результат для построения динамической таблицы, но я не могу найти способ прочитать sObject для списка полей, которые были в запросе.
Я знаю, как получить список ВСЕХ полей, используя информацию getDescribe, но запрос может не содержать все эти поля.
Есть ли способ сделать это?
4 ответа
Предположительно, вы строите запрос как строку, поскольку он динамический, поэтому вы не можете просто пройтись по полям в информации описания, а затем использовать .contains()
в строке запроса, чтобы увидеть, если он был запрошен? Не сумасшедший элегантный, но, кажется, самое простое решение здесь.
Кроме того, возможно, у вас есть список полей, выбранных в списке строк или аналогичных, и вы могли бы просто использовать этот список?
Чтобы получить список полей в 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, и он вернет вам набор имен полей.
Я предлагаю использовать список полей для создания запроса и таблицы. Вы можете поместить список полей в результат так, чтобы он был доступен для всех, кто его использует. Затем вы можете построить таблицу с помощью result.getFields() и получить данные с помощью result.getRows().
for (sObject obj : result.getRows()) {
for (String fieldName : result.getFields()) {
table.addCell(obj.get(fieldName));
}
}
Если вы пытаетесь работать с запросом, который находится вне вашего контроля, вам придется проанализировать запрос, чтобы получить список полей. Но я бы не советовал попробовать это. Это усложняет код способами, которые трудно следовать.
Не уверен, что это именно то, что вы хотели, но что-то вроде этого?
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);
}