有谁知道如何根据它的 id 检索帐户的层次模型?
我尝试使用此查询,但我得到的只是第一组子节点。
select a.Name,a.parentId,a.ownerid,a.id from Account a where Parent.id ='00711314'
有谁知道如何根据它的 id 检索帐户的层次模型?
我尝试使用此查询,但我得到的只是第一组子节点。
select a.Name,a.parentId,a.ownerid,a.id from Account a where Parent.id ='00711314'
SOQL 不支持分层检索,您必须逐级检索,为每个级别生成一个 id 列表,然后使用in <list>
where 运算符检索下一个级别。
请记住,尽管存在州长限制,如果您有大树,您将很容易遇到限制。
如前所述,您不能通过 SOQL 使用分层检索。当我需要其他对象的此功能时(并且当我知道有 < 10k 行时)我选择了所有记录,然后使用列表映射在内存中建立层次结构:
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);
}
}
}
此代码效率低且未经测试(我刚刚将此版本直接写入浏览器),但它应该让您了解如何在平台上处理分层数据。
select a.Name,a.parentId,a.ownerid,a.id from Account a where a.parentId ='00711314'
如果您知道层次结构中的级别数量有限,并且您在每个级别查询有限数量的字段,则可以执行以下操作:
select Id, Name, ownerid,
parent.Id, parent.Name, parent.OwnerId,
parent.parent.Id, parent.parent.Name, parent.parent.OwnerId,
parent.parent.parent.Id, parent.parent.parent.Name, parent.parent.parent.OwnerId
from Account where Parent.id ='00711314'
它很丑陋,但允许您在单个查询中获得固定数量的层次结构级别。