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

前端 未结 6 2018
不思量自难忘°
不思量自难忘° 2020-12-17 10:31

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         


        
相关标签:
6条回答
  • 2020-12-17 11:01

    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;
    }
    
    0 讨论(0)
  • 2020-12-17 11:03

    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;
    }
    
    0 讨论(0)
  • 2020-12-17 11:04

    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.

    0 讨论(0)
  • 2020-12-17 11:12

    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.

    0 讨论(0)
  • 2020-12-17 11:20

    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.

    0 讨论(0)
  • 2020-12-17 11:23

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

    0 讨论(0)
提交回复
热议问题