salesforce SOQL : query to fetch all the fields on the entity
Asked Answered
F

6

17

I was going through the SOQL documentation , but couldn't find query to fetch all the field data of an entity say , Account , like

select * from Account [ SQL syntax ]

Is there a syntax like the above in SOQL to fetch all the data of account , or the only way is to list all the fields ( though there are lot of fields to be queried )

Fanchon answered 8/1, 2012 at 19:15 Comment(0)
M
18

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.

Merwyn answered 8/1, 2012 at 19:21 Comment(1)
thanks for your response . Would you mind sharing an example , to build the query from describeSObject.Fanchon
S
25

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.

Serieswound answered 9/1, 2012 at 1:32 Comment(1)
Thanks Adam . As you agree with superfell , will accept his answer :-)Fanchon
M
18

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.

Merwyn answered 8/1, 2012 at 19:21 Comment(1)
thanks for your response . Would you mind sharing an example , to build the query from describeSObject.Fanchon
K
7

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.

Kestrel answered 22/2, 2013 at 4:9 Comment(0)
F
3

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;
}
Fernanda answered 26/8, 2013 at 17:33 Comment(0)
S
1

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;
}
Saari answered 24/9, 2014 at 17:55 Comment(1)
Please explain what we're looking at, rather than just posting a wall of code. Thanks.Pangolin
F
0

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 !!!

Fennel answered 9/1, 2019 at 10:20 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.