Dynamic SOQL 사용하는 이유
SOQL 동적 쿼리는 런타임에 Apex 코드가 포함된 문자열로 SOQL 쿼리 생성을 참조한다.
쿼리 프로세스 속도를 높이고 서비스를 개선하는 데 유용합니다.
SOQL vs SOSL
SOQL | SOSL | |
Full Name | Salesforce Object Query Language | Salesforce Object Search Language |
Used In: | List Views, Reports, Apex | (Global, Sidebar, Advanced) Search, Apex |
Indexing Happens: | 동기적 - Synchronously (Can have Custom Indexes or Standard Indexes) | Happens Asynchronously. Usually 2-3 min. If over 9000 records loaded at one time, the excess are moved to the bulk index queue. (slower). |
Search Focus: | Accuracy. Gives full set of results that match criteria. | Relevance & Speed. Similar to Google Search. Weightage placed on recently viewed records. |
Search Scope | Can search 1 object at a time. | Can search multiple objects at a time. |
SOQL ->동기적, 기준과 일치하는 전체 결과 세트 반환, 1 object
SOSL->비동기적, 구글검색처럼 관련성 및 속도에 초점, 다중 object 가능
Static SOQL 개념->
Dynamic SOQL이란?
Dynamic SOQL refers to the creation of a SOQL string at run time with Apex code
사용방법
Database.query
Database.queryWithBinds
1. 단일레코드일 때
sObject s = Database.query(string);
2. 둘 이상의 레코드 반환할 때
List<sObject> sobjList = Database.query(string);
3. 바인드변수맵 사용
List<sObject> sobjList = Database.queryWithBinds(string, bindVariablesMap, accessLevel);
String myTestString = 'TestName';
List<sObject> sobjList = Database.query('SELECT Id FROM MyCustomObject__c WHERE Name = :myTestString');
주의
SOQL 동적 쿼리는 개체 필드의 바인딩 표현식이 지원되지 않기 때문에 쿼리 문자열의 변수 필드를 바인딩할 수 없음
오류
MyCustomObject__c myVariable = new MyCustomObject__c(field1__c ='TestField');
List<sObject> sobjList = Database.query('SELECT Id FROM MyCustomObject__c WHERE field1__c = :myVariable.field1__c');
변수 필드를 문자열에 넣고 예제와 같이 SOQL 동적 쿼리 쿼리에서 문자열을 사용하여 해결할 수 있습니다.
해결
String resolvedField1 = myVariable.field1__c;
List<sObject> sobjList = Database.query('SELECT Id FROM MyCustomObject__c WHERE field1__c = :resolvedField1');
--
MyCustomObject__c myVariable = new MyCustomObject__c(field1__c ='TestField');
List<sObject> sobjList = Database.query('SELECT Id FROM MyCustomObject__c WHERE field1__c = :myVariable.field1__c');
위에서 언급한 오류를 방지하려면 변수 필드를 문자열에 넣고 예제와 같이 SOQL 동적 쿼리 쿼리에서 문자열을 사용하여 해결할 수 있습니다.
String resolvedField1 = myVariable.field1__c;
List<sObject> sobjList = Database.query('SELECT Id FROM MyCustomObject__c WHERE field1__c = :resolvedField1');