본문 바로가기

개발자정보

FOR LOOP 내에서 SOQL을 피하는 방법

반응형

「Map를 사용할 수 있어. 이상.」으로 끝입니다만, 너무 맛있지 않기 때문에 실제로 있을 것 같은 구체예를 2개 소개하겠습니다.

 

예 1 : Trigger.new에 대한 루프에서 SOQL을 피합니다.

나쁜 예

trigger AccountTrigger on Account(brefore update){
    for(Account acc: Trigger.new){
        List<Contact> contactList = [SELECT Id,Test__c FROM Contact WHERE AccountId =: acc.Id];
        for(Contact con: contactList){
            //取引先責任者に対する任意の処理
        }
    }
}

↑ 거래처에 묶는 거래처 책임자를 취득함에 있어서, for 루프내에서 SOQL문을 써 버리고 있습니다.

좋은 예

trigger AccountTrigger on Account(brefore update){
    List<Account> accountListWithCountacts = [SELECT Id,(SELECT Id,Test__c FROM Contacts) FROM Account WHERE Id IN:Trigger.newMap.keySet()];
    for(Account acc: accountListWithCountacts){
        for(Contact con: acc.Contacts){
            //取引先責任者に対する任意の処理
        }
    }
}

↑아이 관계명을 이용해 사전에 거래처에 묶는 거래처 책임자를 취득하는 것으로, for 루프내에서의 SOQL의 기술을 회피하고 있습니다.

예 2 : SOQL에서 얻은 목록에 대한 루프의 SOQL을 피합니다.

나쁜 예

List<Account> accountList = [SELECT Id FROM Account LIMIT 100];
    for(Account acc: accountList){
        List<Contact> contactList = [SELECT Id,Test__c FROM Contact WHERE AccountId =: acc.Id];
        for(Contact con: contactList){
        //取引先責任者に対する任意の処理
        }
    }
}

↑ 거래처의 아이 레코드인 거래처 책임자를 취득할 때, for 루프내에서 SOQL를 써 버리고 있습니다.

좋은 예

List<Account> accountList = [SELECT Id FROM Account LIMIT 100];
Map<Id,Account> accountMap = new Map<Id,Account>();
for(Account acc: AccountList){
    accountMap.put(acc.Id,acc);
}
List contactList = [SELECT Id,Test__c FROM Contact WHERE AccounId =: accountMap.keySet()];
for(Contact con: contactList){
//取引先責任者に対する任意の処理
}

↑map의 keySet()를 이용하는 것으로, 리스트로 취득한 거래처를 부모에게 가지는 거래처 책임자만의 좁혀를 실현해, for 루프내에서의 SOQL을 회피하고 있습니다.

반응형