Skip to main content

在 Apex 类中创建 SOQL 查询

学习目标

完成本单元后,您将能够:

  • 在某个方法中创建 SOQL 查询。
  • 控制 SOQL 查询返回的数据。
备注

备注

用中文(简体)学习?在中文(简体)Trailhead Playground 中开始挑战,用括号中提供的译文完成挑战。仅复制并粘贴英文值,因为挑战验证基于英文数据。如果在中文(简体)组织中没有成功通过挑战,我们建议您 (1) 将区域设置切换为美国,(2) 按此处说明将语言切换为英文,(3) 再次单击“检查挑战”按钮。

查看 Trailhead 本地化语言徽章详细了解如何利用 Trailhead 译文。

跟随 Trail Together 进行学习

进行这一步骤时,想要跟随专家一起学习吗?查看此视频,它是 Trailhead Live 上 Trail Together 系列的一部分。

(此视频片段从 17:32 开始,如果您想要倒回去再次观看步骤的开头部分可以从这里开始。)

简介

既然您已经了解 SOQL 查询的基本知识,您可以把公式字段知识应用到 SOQL 查询中。

我们的查询非常简单:SELECT FirstName, LastName FROM Contact

现在我们需要一个对象来保存结果数据。因为 SOQL 查询总是以列表的形式返回数据,所以我们来创建一个 Apex 列表。您在管理员 Apex 基础中学过,要声明一个列表,您需要几个东西:该列表的保留字,数据类型(< > 字符中的内容)以及新列表的名称。对于该查询,数据类型是联系人,我们把新列表命名为 listOfContacts。列表声明如下所示:

List<Contact> listofContacts

要把查询的结果赋予新列表,我们在列表声明和查询之间放入一个赋值运算符,等号 (=),如下所示:

List<Contact> listofContacts = [SELECT FirstName, LastName FROM Contact];

注意语法。查询放在了方括号 [ ] 中,语句以分号 (;) 收尾。

我们在 Developer Console 中尝试一下。为进行测试,我们把联系人列表发到调试日志中,这样我们可以看到代码运行得如何。

在 Developer Console 中测试代码

  1. 在 Developer Console 中,单击 Debug(调试) | Open Execute Anonymous Window(打开执行匿名窗口)
  2. 在“执行匿名”窗口中,把查询结果赋予新列表:
    List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact LIMIT 2];
  3. 在下一行上,把 listOfContacts 列表发送到调试日志:
    system.debug(listOfContacts);
  4. 单击打开日志复选框。
  5. 单击执行
  6. 在“执行日志”窗口底部,单击仅限调试复选框。
    调试日志的前两项看起来应该是这样的:
  7. [2] | DEBUG | (Contact: {FirstName = Rose, LastName = Gonzalez, Id = 0036g000040KuVAAU}, Contact: {FirstName = Sean, LastName = Forbes, Id=0036g0000040KuCAAU}).联系人记录按顺序排列,以逗号隔开。

    如果查询找不到任何结果,它仍然返回一个列表,但列表是空的:

    [2]|DEBUG|()

这里实际上发生了什么?

SELECT FirstName, LastName FROM Contact LIMIT 2 箭头指向云中的联系人对象图标。把符合查询条件的数据发送到 Apex 类的第二个箭头指向联系人列表。1.FirstName = Rose, LastName = Gonzalez.2.FirstName = Sean, LastName = Forbes.

代码运行时,首先处理查询:

SELECT FirstName, LastName FROM Contact LIMIT 2

查询找到所有联系人,并获取每条记录的姓和名,然后代码把来自那些联系人记录的被选中数据添加到名为 listOfContacts 的列表中。

最后,第 2 行,System.debug 显示 listOfContacts 的内容。

在 Apex 中运行 SOQL 查询

在上一个单元,您用查询编辑器在表格中返回数据。在本单元,您用“执行匿名”窗口来运行查询并把结果发送到调试日志中。这种方法暂时是可行的,但是您的用户不会在 Developer Console 中运行查询。您需要一种方法在组织的用户界面中返回数据。Apex 类和方法可以做到这一点。我们来研究如何在 Apex 中运行 SOQL 查询并控制结果。

我们先在 Apex 类中创建一个 Apex 方法。该 Apex 方法运行我们的查询,选取我们需要的数据。

  1. 在 Developer Console 中,单击文件 | 新建| Apex 类
  2. 把这个类命名为 ContactUtility,然后单击确定
  3. 这个类打开,显示声明这个类并且为类的主体留空的代码。

  4. 在第 2 行,添加一个名为 viewContacts 的方法。
    public static void viewContacts(){
    }
  5. 在第 3 行,在 viewContacts 方法内部,粘贴运行查询并把结果赋予新列表的代码:
    List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact];
  6. 保存这个类。

现在 listOfContacts 列表中便有了我们想要的数据。我们将用一个 for 循环来迭代整个列表,构建我们想要的输出格式。

使用 For 循环来迭代整个列表

管理员面向对象的编程中,您学过如何使用 For 循环逐个处理列表中的项目。在这里,我们用 For 循环将每个联系人的姓和名组合起来,形成联系人的全名。首先,我们创建循环,然后处理这个循环内的每条记录。

为了声明 For 循环,我们需要一个变量名称、它的数据类型以及这个循环迭代的列表的名称。

在 For 循环中,我们不直接引用特定对象,而是创建一个变量来代表循环内部的列表项,一次一个。变量充当列表中每个项目的占位符。变量可以是任意名称,不过我们简单一点吧。我们用 con,我们需要该变量的数据类型,即联系人,以及列表名称,即 listOfContacts。全部放在一起,看起来是这样的:

for (Contact con : listOfContacts){ //loop body}

声明 For 循环

  1. 在 viewContacts 方法中,在 SOQL 查询后面,粘贴这个代码:
    for (Contact con : listOfContacts){
        //loop body
    }
  2. 保存这个类。

我们查询了数据库 (1),选取了数据,并把数据保存到列表中 (2),然后创建了一个 for 循环 (3)。

1.Select FirstName, LastName FROM Contact LIMIT 2 这条查询给 listOfContacts 列表 (2) 输入数据。3.处理 listOfContacts 列表中的联系人的 For 循环:for(Contact con : listOfContacts){ //logic goes here}

接着,在循环中,我们处理列表中的项目。最后,我们想以这样的格式显示 listOfContacts 中的每个联系人:

First Name:<contact's first name>, Last Name:<contact's last name>

要引用列表中某个项目的某个字段,使用点记法指定对象及其字段 (object.field)。比如,在 con(对象变量)和 FirstName(字段)之间放入一个英文句号(点记法中的“点”),引用 listOfContacts 列表中联系人对象的 FirstName 字段,如下所示:

con.FirstName

列表包含分开的姓和名字段。在 Apex 中,我们用串联来组合字段值(有时候也有文本)。(您在管理员 Apex 基础中做过一些串联。)

温习一下,做串联的时候,字段数据用 object.field 表示。文本用单引号引起来。需要的时候,不要忘了在文本的开头和结尾留空格。用加号 (+) 来组合多个字段或组合一个字段和一些文本。

我们来填充 For 循环的主体。首先,对于 listOfContacts 列表中的每一项,我们将 FirstName 和 LastName 组合在一个名叫 fullname 的新变量中:

String fullName = 'First Name: ' + con.FirstName + ', Last Name: ' + con.LastName;

请注意 FirstName 和 LastName 之间有空格。输出应该是这样的:

First Name:Angela, Last Name:Carter

不是

FirstName:Angela,LastName:Carter

给 fullName 变量(数据类型:字符串)赋值后,我们把那个变量插入到下一行的调试语句中:

system.debug(fullName);

处理 For 循环中的列表项

  1. 在 viewContacts 方法中,把 //loop body 替换为以下代码:
    String fullName = 'First Name: ' + con.FirstName + ', Last Name: ' + con.LastName;
    system.debug(fullName);
  2. 保存这个类。

您的代码如下所示:

public class ContactUtility {
    public static void viewContacts(){
        List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact];
        for (Contact con : listOfContacts){
            String fullName = 'First Name: ' + con.FirstName + ', Last Name: ' + con.LastName;
            system.debug(fullName);
        }
    }
}

既然我们已经准备好了一个类、一个方法以及一个 SOQL 查询,那我们就来运行代码,看看它是否有效吧。要在“执行匿名”窗口中运行 Apex 代码,我们需要用点记法指定类和方法。

  1. 打开“执行匿名”窗口。
  2. 在 Enter Apex Code(输入 Apex 代码)窗口中,用以下代码替换现有代码:
    ContactUtility.viewContacts();
  3. 确认打开日志已勾选。
  4. 单击执行
  5. 选择仅限调试

结果的前六行应该是:

执行日志
事件
详细信息
USER_DEBUG
[5]|DEBUG|First Name: Rose, Last Name: Gonzalez
USER_DEBUG
[5]|DEBUG|First Name: Sean, Last Name: Forbes
USER_DEBUG
[5]|DEBUG|First Name: Jack, Last Name: Rogers
USER_DEBUG
[5]|DEBUG|First Name: Pat, Last Name: Stumuller
USER_DEBUG
[5]|DEBUG|First Name: Andy, Last Name: Young
USER_DEBUG
[5]|DEBUG|First Name: Tim, Last Name: Barr

看!通过 SOQL、一个 For 循环和串联,您提取了联系人数据,把数据赋予一个列表,迭代了整个列表,并且生成了预期结果。好样的!

资源

在 Salesforce 帮助中分享 Trailhead 反馈

我们很想听听您使用 Trailhead 的经验——您现在可以随时从 Salesforce 帮助网站访问新的反馈表单。

了解更多 继续分享反馈