Skip to main content
From 16:00 UTC on January 17, 2026, to 20:00 UTC on January 17, 2026, we will perform planned maintenance on the Trailhead, myTrailhead, and Trailblazer Community sites. During the maintenance, these sites will be unavailable, and users won't be able to access them. Please plan your activities around this required maintenance.

在 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. 在 Enter Apex Code(输入 Apex 代码)窗口中,把查询结果赋予新列表:
    List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact LIMIT 2];
  3. 在下一行上,把 listOfContacts 列表发送到调试日志:
    System.debug(listOfContacts);
  4. 单击打开日志复选框。
  5. 单击执行
  6. 在“执行日志”窗口底部,单击仅限调试复选框。
    调试日志的前两项看起来应该是这样的:

[2

  1. 如果查询找不到任何结果,它仍然返回一个列表,但列表是空的:
    [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,然后单击 OK(确定)
  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 帮助网站访问新的反馈表单。

了解更多 继续分享反馈