Как уже говорилось, вы не можете использовать иерархический поиск с SOQL.Когда мне понадобилась эта функциональность с другими объектами (и когда я знаю, что <10k строк), я выбрал все записи, а затем использовал карту списков для построения иерархии в памяти: </p>
map<id, list<id>> mapParentToChildren = new map<id, list<id>>();
for(Record__c [] sRecordArr : [select Id, Parent__c from Record__c limit 10000])
{
for(Record__c sRecord : sRecordArr)
{
if(mapParentToChildren.get(sRecord.Parent__c) == null)
{
mapParentToChildren.put(sRecord.Parent__c, new list<id>{sRecord.Id});
}
else
{
mapParentToChildren.get(sRecord.Parent__c).add(sRecord.Id);
}
}
}
Затем вы можете использовать рекурсивную функцию для выполнения операций и т. Д. Над данными, например (не проверено):
// top level records will have a null parent, so be in the 'null' list
for(id idRecord : mapParentToChildren.get(null))
{
PrintTree(idRecord, 0);
}
public void PrintTree(id idRecord, int iLevel)
{
string strLevel = '*';
for(integer i = 0; i < iLevel; i++)
{
strLevel += '*';
}
System.Debug(strLevel + idRecord);
if(mapParentToChildren.get(idRecord) != null)
{
for(id idChild : mapParentToChildren.get(idRecord))
{
PrintTree(idChild, iLevel + 1);
}
}
}
Этот код неэффективен и не проверен (я только что написал эту версию прямов браузер), но он должен дать вам представление о том, как вы можете работать с иерархическими данными на платформе.