Wednesday 21 January 2015

Dynamic SOQL Field Names in Query !


SObject row was retrieved via SOQL without querying the requested field

This might be a smaller error which you can easily address. But, there are challenges imposed when in an Query we need to add many fields to be retrieved. For Example:

Problem: 

Say, You are building a dynamic query in which you have to extract more than 30 fields in the query. Added problem is there are a couple of Objects for which dynamic query is created.

or 

You want to remove this [SObject row was retrieved via SOQL without querying the requested field] Error permanently from your code-life. 

Solution: 

Just copy & paste the code shown below in your utility method.




During creation of query when you require to access all field names of any object just call the sober static method by passing the API Name of the Object as parameters : 

string query = BuildQueryUtil.fieldNames('Contact') + 'FROM Contact WHERE Name != null LIMIT 100 '
List<Contact> extractedContacts = Database.Query(query);

This works as a charm & results:  

SELECT phone, jigsaw, mailinglatitude, otherstate, leadsource, lastactivitydate, createdbyid, otherphone, description, isdeleted, level__c, systemmodstamp, assistantphone, isemailbounced, otherstreet, languages__c, otheraddress, fax, hasoptedoutofemail, createddate, ownerid, hasoptedoutoffax, canallowportalselfreg, jigsawcontactid, lastvieweddate, lastcuupdatedate, credit_status__c, email, donotcall, othercity, lastmodifiedbyid, mailingstate, reportstoid, photourl, department, lastcurequestdate, lastname, otherlongitude, ispersonaccount, lastmodifieddate, id, mailinglongitude, mailingcountry, mobilephone, mailingaddress, title, lastreferenceddate, email_2_other_one__c, otherlatitude, emailbounceddate, name, birthdate, mailingstreet, homephone, accountid, emailbouncedreason, masterrecordid, otherpostalcode, mailingpostalcode, firstname, assistantname, othercountry, salutation, mailingcity FROM Contact WHERE Name != null LIMIT 100

You can also extend this into nested queries to get the field Names of the Child Records.

Note: This might not serve as a Best Practice as it increases the Heap Size {Heap Size have Governor Limit } & can degrade the performance. More, Do not use if you are building packages. Use it in specific cases when you need all fields and the size of the field names is lesser than 20,000.


Happy Coding!