Apex 동적 DML

HEP·2023년 2월 20일
0
// 필드의 Label, Api Name을 Map 형식으로 저장 
Map<String, Schema.SObjectField> fieldMap = Schema.getGlobalDescribe().get(objectApiName).getDescribe().fields.getMap();
Map<String, String> labelMap = new Map<String, String>();
String fieldLabel;
for (String fieldName: fieldMap.keySet()) {
	fieldLabel = fieldMap.get(fieldName).getDescribe().getLabel();
	labelMap.put(fieldLabel, fieldName);
}
    
List<Object> obj; // obj에 필드 Label로 값이 저장되어 있다고 가정(Account Name = 'abc company')
List<Map<String, Object>> fieldLabelListMap = new List<Map<String, Object>>();

// List<Object>를 serialize 한 뒤 List<Object>로 deserializeUntyped 
String jsonUpdateObj = JSON.serialize(obj);
List<Object> result = (List<Object>)JSON.deserializeUntyped(jsonUpdateObj);
        
// obj를 Map 형태로 Sobj 형식에 맞게 저장
for(Object o : result){
	Map<String,Object> tempSobjMap = (Map<String,Object>)obj;
    Map<String, Object> tempFieldMap = new Map<String, Object>();
    for(String key : tempSobjMap.keySet()) {
    	tempFieldMap.put(fieldLabelMap.get(key), tempSobjMap.get(key));
    }
    fieldLabelListMap.add(tempFieldMap);
}

// Json 형태로 바꿈
String jsonConvertFieldApi = JSON.serialize(fieldLabelListMap);

// Account 형태로 형변환
List<Account> masterIPs =
                (List<Account>) JSON.deserialize(jsonConvertFieldApi,List<Account>.class);

Summary

  1. List<Map<String, Object>> 을 JSON.serialize 로 String으로 변환한 뒤, JSON.deserialize로 타입에 맞게 형변환을 하면, List<SObject> 로 변환시킬 수 있다.
  2. SObject에서 값을 가져오는 경우, 두 가지 방법으로 가져올 수 있다.
    Acccount a = [SELECT Name FROM Account LIMIT 1];
    1) a.Name
    2) a.get('Name') // 동적으로 값 가져올 수 있다.
  3. 동적으로 데이터를 세팅할 수도 있다. (cf.쿼리문에 없는 field도 업데이트 가능)
    a.put('fieldApiName', value);
    update a;
  4. LWC 등에서 List<Object>를 파라미터로 받아오는 경우, SObject로 캐스팅하기 위해 serialize 한 뒤 deserialize한다.
    • 곧바로 타입캐스팅 하지 않는 이유 : List<ANY> 로 인식해 System.TypeException: Invalid conversion from runtime type 에러 발생
      deserializeUntyped 하는 이유
    • ({Account Name : abc company})
      이러한 형태를 Map<String, String>으로 인식하지 않고
      Map<Object, Object> 형태로 인식하기 때문에 JSON으로 형변화를 하는 편이 좋다.
    • cf) Map<Object, Object> 형태를 그대로 활용하려면 형변환은 필요 없다.
    • deserialize : (List<Account>) JSON.deserialize(json, List<Account>.class);
    • deserializeUntyped : List<Object> result = (List<Object>) JSON.deserializeUntyped(json);
profile
셀포합니다

0개의 댓글