Как получить список полей в универсальном 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);
    }
Другие вопросы по тегам