salesforce SOQL : query to fetch all the fields on the entity

て烟熏妆下的殇ゞ 提交于 2019-11-29 05:40:00

You have to specify the fields, if you want to build something dynamic the describeSObject call returns the metadata about all the fields for an object, so you can build the query from that.

Adam

Create a map like this:

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

Then you can iterate through fldObjMapValues to create a SOQL query string:

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 is correct, there is no way to directly do a SELECT *. However, this little code recipe will work (well, I haven't tested it but I think it looks ok). Understandably Force.com wants a multi-tenant architecture where resources are only provisioned as explicitly needed - not easily by doing SELECT * when usually only a subset of fields are actually needed.

I use the Force.com Explorer and within the schema filter you can click the checkbox next to the TableName and it will select all the fields and insert into your query window - I use this as a shortcut to typeing it all out - just copy and paste from the query window. Hope this helps.

In case anyone was looking for a C# approach, I was able to use reflection and come up with the following:

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);
}

It appears to work for the objects I've tested (and matches the columns generated by the API test). From there, it's about creating the query:

/* 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;
}

For me it was the first time with Salesforce today and I came up with this in 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;
}

I used following to get complete records-

query_all("Select Id, Name From User_Profile__c")

To get complete fields of record, we have to mention those fields as mentioned here- https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select.htm

Hope will help you !!!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!