Salesforce SOQL: запрос на выборку всех полей объекта

Я просматривал документацию SOQL, но не смог найти запрос для получения всех данных поля объекта, скажем, Account, например

select * from Account [ SQL syntax ]

Есть ли в SOQL синтаксис, подобный приведенному выше, для получения всех данных учетной записи, или единственный способ - перечислить все поля (хотя есть много полей, которые нужно запросить)


person Sukhhhh    schedule 08.01.2012    source источник


Ответы (6)


Вы должны указать поля, если вы хотите создать что-то динамическое, вызов describeSObject возвращает метаданные обо всех полях для объекта, так что вы можете построить запрос на основе этого.

person superfell    schedule 08.01.2012
comment
Спасибо за ваш ответ . Не могли бы вы поделиться примером, чтобы построить запрос из describeSObject. - person Sukhhhh; 08.01.2012

Создайте такую ​​карту:

Map<String, Schema.SObjectField> fldObjMap = schema.SObjectType.Account.fields.getMap();
List<Schema.SObjectField> fldObjMapValues = fldObjMap.values();

Затем вы можете выполнить итерацию по fldObjMapValues ​​для создания строки запроса SOQL:

String theQuery = 'SELECT ';
for(Schema.SObjectField s : fldObjMapValues)
{
   String theLabel = s.getDescribe().getLabel(); // Perhaps store this in another map
   String theName = s.getDescribe().getName();
   String theType = s.getDescribe().getType(); // Perhaps store this in another map

   // Continue building your dynamic query string
   theQuery += theName + ',';
}

// Trim last comma
theQuery = theQuery.subString(0, theQuery.length() - 1);

// Finalize query string
theQuery += ' FROM Account WHERE ... AND ... LIMIT ...';

// Make your dynamic call
Account[] accounts = Database.query(theQuery);

superfell верен, нет возможности напрямую выполнить SELECT *. Однако этот небольшой рецепт кода будет работать (ну, я не тестировал его, но думаю, что он выглядит нормально). Понятно, что Force.com хочет многопользовательскую архитектуру, в которой ресурсы предоставляются только в случае явной необходимости - это нелегко, выполняя SELECT *, когда обычно действительно требуется только подмножество полей.

person Adam    schedule 09.01.2012
comment
Спасибо, Адам. Поскольку вы согласны с superfell, приму его ответ :-) - person Sukhhhh; 09.01.2012

Я использую Force.com Explorer, и в фильтре схемы вы можете установить флажок рядом с TableName, и он выберет все поля и вставит их в окно запроса - я использую это как ярлык для ввода всего этого - просто скопируйте и вставить из окна запроса. Надеюсь это поможет.

person Renee Pennington    schedule 22.02.2013

В случае, если кто-то искал подход C #, я смог использовать отражение и придумал следующее:

public IEnumerable<String> GetColumnsFor<T>()
{
    return typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)
        .Where(x => !Attribute.IsDefined(x, typeof(System.Xml.Serialization.XmlIgnoreAttribute))) // Exclude the ignored properties
        .Where(x => x.DeclaringType != typeof(sObject)) // & Exclude inherited sObject propert(y/ies)
        .Where(x => x.PropertyType.Namespace != typeof(Account).Namespace)  // & Exclude properties storing references to other objects
        .Select(x => x.Name);
}

Кажется, он работает для объектов, которые я тестировал (и соответствует столбцам, созданным тестом API). Оттуда речь идет о создании запроса:

/* assume: this.server = new sForceService(); */

public IEnumerable<T> QueryAll<T>(params String[] columns)
    where T : sObject
{
    String soql = String.Format("SELECT {0} FROM {1}",
        String.Join(", ", GetColumnsFor<T>()),
        typeof(T).Name
    );
    this.service.QueryOptionsValue = new QueryOptions
    {
        batchsize = 250,
        batchSizeSpecified = true
    };
    ICollection<T> results = new HashSet<T>();
    try
    {
        Boolean done = false;
        QueryResult queryResult = this.service.queryAll(soql);
        while (!finished)
        {
            sObject[] records = queryResult.records;
            foreach (sObject record in records)
            {
                T entity = entity as T;
                if (entity != null)
                {
                    results.Add(entity);
                }
            }
            done &= queryResult.done;
            if (!done)
            {
                queryResult = this.service.queryMode(queryResult.queryLocator);
            }
        }
    }
    catch (Exception ex)
    {
        throw; // your exception handling
    }
    return results;
}
person Brad Christie    schedule 26.08.2013

Для меня это был первый раз сегодня с Salesforce, и я придумал это на Java:

/**
 * @param o any class that extends {@link SObject}, f.ex. Opportunity.class
 * @return a list of all the objects of this type
 */
@SuppressWarnings("unchecked")
public <O extends SObject> List<O> getAll(Class<O> o) throws Exception {
    // get the objectName; for example "Opportunity"
    String objectName= o.getSimpleName();

    // this will give us all the possible fields of this type of object
    DescribeSObjectResult describeSObject = connection.describeSObject(objectName);

    // making the query
    String query = "SELECT ";
    for (Field field : describeSObject.getFields()) { // add all the fields in the SELECT
        query += field.getName() + ',';
    }
    // trim last comma
    query = query.substring(0, query.length() - 1);

    query += " FROM " + objectName;

    SObject[] records = connection.query(query).getRecords();

    List<O> result = new ArrayList<O>();
    for (SObject record : records) {
        result.add((O) record);
    }
    return result;
}
person Koen De Jaeger    schedule 24.09.2014
comment
Пожалуйста, объясните, на что мы смотрим, вместо того, чтобы просто размещать стену кода. Спасибо. - person Andrew; 24.09.2014

Я использовал следующие, чтобы получить полные записи -

query_all("Select Id, Name From User_Profile__c")

Чтобы получить полные поля записи, мы должны упомянуть эти поля, как указано здесь - https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select.htm

Надеюсь вам поможет !!!

person S.Yadav    schedule 09.01.2019