Salesforce

[세일즈포스] Static SOQL VS Dynamic SOQL

송테이토 2023. 2. 12. 19:59

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 개념->

https://songsunkite.tistory.com/entry/%EC%84%B8%EC%9D%BC%EC%A6%88%ED%8F%AC%EC%8A%A4-What-is-SOQL-SOQL-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%B0%8F-%EC%98%88%EC%A0%9C 

 

[세일즈포스] What is SOQL?( SOQL 사용법 및 예제)

💡 SOQL 쿼리란? SOQL은 Salesforce Object Query Language의 약자! SOQL을 사용해 조직의 데이터베이스에 저장되어 있는 정보를 읽을 수 있다. 세일즈포스는 SOQL을 이용해서 SQL의 기능을 한다. SOQL의 구문은 S

songsunkite.tistory.com

 

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');