Salesforce Apex - 从SOQL查询填充对象

时间:2013-04-12 11:20:56

标签: salesforce apex-code soql

我有一个简单的SOQL查询,它返回与Contact和CampaignMember相关的信息。我正在尝试使用SOQL查询的结果填充自定义对象。但是,在加载Visualforce页面时出现以下错误:

CampaignMember的字段campaign.name无效

List campaignMembers = [select campaign.name, contact.id,contact.firstname, contact.lastname, status, campaignId from CampaignMember where contactId = '003U000000U0eNq' and  campaignId in :campaigns];

for (Integer i = 0; i < campaignMembers.size(); i++) {
    results.add(new CampaignMemberResult(
        (String)campaignMembers[i].get('CampaignId'), 
        (String)campaignMembers[i].get('campaign.name'),
        true
    ));
}

我在Developer Console中单独运行了SOQL查询,并成功查询。为什么我不能从for循环中的SOQL查询中提取campaign.name?

1 个答案:

答案 0 :(得分:4)

您看到的错误是由您应将其写为campaignMembers[i].Campaign.Name引起的。或者如果你坚持使用getter语法campaignMembers[i].getSobject('Campaign').get('Name')

您需要包装器对象(或任何CampaignMemberResult)的任何特殊原因? 我有一种奇怪的感觉,你正在编写太多的代码来实现简单的东西;)campaignMembers[i].Campaign.Name的语法也意味着你不必使用强制转换为String。


另外 - 如果您需要知道“此联系人发生了哪些广告系列”,您有两种方式:

<强>平

select contact.id,contact.firstname, contact.lastname, 
    campaignid, campaign.name, 
    status 
from CampaignMember 
where contactId = '003U000000U0eNq'

<强>子查询

通过联系人,您可以转到相关的广告系列成员列表,然后转到广告系列以获取他们的名字

SELECT Id, FirstName, LastName,
    (SELECT CampaignId, Campaign.Name FROM CampaignMembers)
FROM Contact WHERE Id = '003U000000U0eNq'

如何在visualforce中直接使用“平坦”结果(没有CampaignMemberResult):

顶点:

public List<CampaignMember> flatMembers {get;set;} // insert dick joke here

flatMembers = [select contact.id,contact.firstname, contact.lastname, 
    campaignid, campaign.name, 
    status 
from CampaignMember 
where contactId = '003U000000U0eNq'];

VF:

<apex:pageBlockTable value="{!flatMembers}" var="cm">
    <apex:column value="{!cm.Contact.LastName}" />
    <apex:column value="{!cm.Status}" />
    <apex:column value="{!cm.Campaign.Name}" />

修改

  

我的最终目标是在联系人上显示的Visualforce页面   记录显示所有广告系列列表,每个广告系列旁边都有一个复选框   指示联系人是否是会员。

你意识到它可以很快成长为一张很长的桌子吗?也许对广告系列进行一些过滤(如果您想阅读某些高级内容 - 请查看“StandardSetController”的文档)。此外,我非常确定有一些方法可以从广告系列报告中向广告系列添加联系人/潜在客户 - 也许开箱即用的东西可以节省您的时间并且更易于维护......

但代码解决方案非常简单,首先是辅助包装类:

public class CampaignWrapper{
    public Boolean selected {get;set;}
    public Campaign c {get; private set;}
    public CampaignWrapper(Campaign c){
        this.c = c;
        selected = !c.CampaignMembers.isEmpty();
    }
}

然后查询并构建包装器列表:

List<CampaignWrapper> wrappers = new List<CampaignWrapper>();
for(Campaign c : [SELECT Id, Name, (SELECT Id FROM CampaignMember WHERE ContactId = '...')
    FROM Campaign
    LIMIT 1000]){
    wrappers.add(new CampaignMember(c));
}

你应该全部设置;)如果它只是用于显示 - 你可能甚至不需要包装类(可能在visualforce表达式中使用一些技巧或使用Map<Campaign, Boolean>甚至......

1000条记录是传递给Visualforce的集合的限制(如果您的页面是只读的,则为10K)。过去 - 分页,最有可能与上述StandardSetController一起使用。