Kiedy wykonujemy zapytanie SOQL najczęściej korzystamy ze składni, która do listy lub mapy przypisuje wynik zapytania. Nie zawsze jednak wiemy jakie pola będą nam potrzebne lub potrzebujemy uzyskać QueryLocator np. do wykonania batcha. Zajmijmy się więc tym przypadkiem.
Tworząc klasę, która będzie implementowała Database.Batchable musimy w pierwszej kolejności zaimplementować metodę start, która to zwraca wynik w postaci QueryLocator. Oczywiście można to uzyskać za pomocą Apexa np : Database.getQueryLocator([SELECT Id FROM Account]).getQuery();
Powyższa konstrukcja sprawdzi się idealnie jeżeli na etapie zapytania wiemy już wszystko o wymaganych polach. Co jednak w sytuacji, kiedy tej informacji nam brakuje? Możemy użyć właśnie wzorca budowniczego.
Prostą implementację wzorca budowniczego można znaleźć pod tym linkiem.
Wystarczy stworzyć obiekt klasy SOQLBuilder i na nim wywoływać odpowiednie metody.
Prosty przykład jak wykorzystać klasę budowniczego do utworzenia QueryLocator dla batcha :
global Database.Querylocator start(Database.BatchableContext BC) {
SOQLBuilder soqlBuilder = new SOQLBuilder()
.SELECTFields(new String[]{
'Id', 'CreatedById', 'CreatedDate', 'IsDeleted', 'LastModifiedById',
'LastModifiedDate', 'Status', 'SystemModstamp', 'TargetObjectId', 'ProcessInstance.TargetObject.Name'
})
.FROMObject('ProcessInstance')
.WHEREField('ProcessInstance.TargetObject.Type', '=', 'TestObject__c')
.WHEREField('AND', 'Status', '=', 'Pending');
return soqlBuilder.getQueryLocator();
}
Źródło : GitHub.