Hello friends, today we are going to discuss Fetch Records By LIST VIEW Id In Apex. A LIST view is essentially a filtered and organized representation of data in a Salesforce object. It allows users to define a set of criteria and sorting options to display only the records that meet those criteria. LIST views are commonly used to provide users with a focused and customizable view of data.
One common task in Apex development is retrieving records from a Salesforce object based on specific criteria. While SOQL (Salesforce Object Query Language) is commonly used for querying data, there’s an often overlooked approach that can simplify the process – fetching query results by using a LIST view ID.
Also, check this: Invoke Tooling API From LWC Salesforce
Key Highlights :
- We use Tooling API to fetch query of any LIST view Id and then execute.
- Tooling API allows developers to dynamically query metadata information using SOQL.
- We can call Tooling API by REST API in APEX.
- Use Userinfo.GetSessionId for Authorization.
Code :
ListViewsResponse.cls :
/** * @description : This class represents the response recieved from the List View APIs which the Salesforce offers. * @coverage : Test.cls | @CC100% * @author : techdicerkeeplearning@gmail.com * @group : Techdicer * @last modified on : 05-27-2023 * @last modified by : techdicerkeeplearning@gmail.com * Modifications Log * Ver Date Author Modification * 1.0 05-27-2023 techdicerkeeplearning@gmail.com Initial Version | Story Number | @CC100% **/ public class ListViewsResponse { public Boolean done; public List<ListView> listviews; public Object nextRecordsUrl; public Integer size; public String sobjectType; public class ListView { public String describeUrl; public String developerName; public String id; public String label; public String resultsUrl; public Boolean soqlCompatible; public String url; } public static ListViewsResponse parse( String json ) { return ( ListViewsResponse ) System.JSON.deserialize( json, ListViewsResponse.class ); } }
ListViewsDescribeResponse.cls :
public class ListViewsDescribeResponse { public class OrderBy { public String fieldNameOrPath; public String nullsPosition; public String sortDirection; } public List<Columns> columns; public String id; public List<OrderBy> orderBy; public String query; public String scope; public String sobjectType; public WhereCondition whereCondition; public class Columns { public String ascendingLabel; public String descendingLabel; public String fieldNameOrPath; public Boolean hidden; public String label; public String selectListItem; public String sortDirection; public Integer sortIndex; public Boolean sortable; public String type; } public class WhereCondition { public List<Conditions> conditions; public String conjunction; } public class Conditions { } public static ListViewsDescribeResponse parse(String json) { return (ListViewsDescribeResponse) System.JSON.deserialize(json, ListViewsDescribeResponse.class); } }
ListViewAPI.cls :
/** * @description : This class is created to make calls to List View APIs which Salesforce offers to get the List View details of a particular object. * @coverage : Test.cls | @CC100% * @author : techdicerkeeplearning@gmail.com * @group : Techdicer * @last modified on : 05-27-2023 * @last modified by : techdicerkeeplearning@gmail.com * Modifications Log * Ver Date Author Modification * 1.0 05-27-2023 techdicerkeeplearning@gmail.com Initial Version | Story Number | @CC100% **/ public class ListViewAPI { /** * @description This method is created to call the getListViewQuery method fetch query and query the data * @author techdicerkeeplearning@gmail.com | 05-27-2023 | Story Number **/ public static void fetchDataAccordingListView(){ String query = getListViewQuery('00B6F00000BMrbT', 'Contact'); List<Sobject> SObjectList = Database.query(query); System.debug('SObjectList==> ' + SObjectList); } /** * @description This method is created to make request to the List View APIs with the object name to get the List Views in that object. * @author techdicerkeeplearning@gmail.com | 05-27-2023 | Story Number * @param sObjectName The name of the Object whose List Views are required. * @param ListViewsResponse Returns an instance of the 'ListViewsResponse' class which contains the List Views existing in the selected Object. * @return ListViewsResponse **/ public static ListViewsResponse getListViews(String sObjectName) { Http http = new Http(); HttpRequest httpReq = new HttpRequest(); String orgDomain = Url.getSalesforceBaseUrl().toExternalForm(); String endpoint = orgDomain + '/services/data/v37.0/sobjects/' + sObjectName + '/listviews'; httpReq.setEndpoint(endpoint); httpReq.setMethod('GET'); httpReq.setHeader('Content-Type', 'application/json; charset=UTF-8'); httpReq.setHeader('Accept', 'application/json'); String sessionId = 'Bearer ' + UserInfo.getSessionId(); httpReq.setHeader('Authorization', sessionId); HttpResponse httpRes = http.send(httpReq); ListViewsResponse listViewResp = (ListViewsResponse) JSON.deserialize( httpRes.getBody(), ListViewsResponse.class); return listViewResp; } /** * @description This method is created to get the Query to obtain records from a particular object * @author techdicerkeeplearning@gmail.com | 05-27-2023 | Story Number * @param listViewId Recieves the List View Id whichever the User wants. * @param objName The name of the SObject. * @return String Returns the query for the particular List View. **/ public static String getListViewQuery(String listViewId, String objName) { Http http = new Http(); HTTPRequest httpReq = new HTTPRequest(); String orgDomain = Url.getSalesforceBaseUrl().toExternalForm(); String endpoint = orgDomain + '/services/data/v37.0/sobjects/' + objName + '/listviews/' + listViewId + '/describe'; httpReq.setEndpoint( endpoint ); httpReq.setMethod( 'GET' ); httpReq.setHeader( 'Content-Type', 'application/json; charset=UTF-8' ); httpReq.setHeader( 'Accept', 'application/json' ); String sessionId = 'Bearer ' + UserInfo.getSessionId(); httpReq.setHeader( 'Authorization', sessionId ); HTTPResponse httpRes = http.send(httpReq); System.debug(httpRes.getBody()); if(httpRes.getStatusCode() == 200){ ListViewsDescribeResponse listViewDescResp = (ListViewsDescribeResponse) JSON.deserialize(httpRes.getBody(), ListViewsDescribeResponse.class); return listViewDescResp.query; } else{ return ''; } } }
2 comments
I called method fetchDataAccordingListView( i.e. getListViewQuery) from the Aura init method and it gave me 401 status code. Session Id authentication not working as expected
Hi @SM, by Aura component you can not use UserInfo.getSessionId()
You can create VF page and get session Id in apex. you can take reference from below blog
https://techdicer.com/invoke-tooling-api-from-lwc-salesforce/