クエリ結果について
クエリ結果は、ネスト化されたオブジェクトとして返されます。SOQL クエリのメイン SELECT ステートメントで処理される主なオブジェクトは、サブクエリのクエリ結果を含みます。
たとえば、次のように親-子または子-親構文のいずれかを使用して、クエリを作成できます。
- 子-親:
1SELECT Id, FirstName, LastName, AccountId, Account.Name 2 3FROM Contact 4 5WHERE Account.Name LIKE 'Acme%'このクエリは、WHERE 句の条件を満たすすべての取引先責任者に関して、(返されるレコードが多すぎない場合) 1 行ごとに 1 つのクエリ結果を返します。
- 親-子:
1SELECT Id, Name, 2 3 ( 4 5 SELECT Id, FirstName, LastName 6 7 FROM Contacts 8 9 ) 10 11FROM Account 12 13 WHERE Name like 'Acme%'このクエリは、取引先のセットを返します。そして、各取引先内では、サブクエリからの取引先責任者情報を含む Contact 項目のクエリ結果セットを返します。
サブクエリの結果でも、通常のクエリ結果と同様に、子の数が多い場合、すべてのレコードを取得するには queryMore() の使用が必要になることがあります。たとえば、取引先にサブクエリを含むクエリを発行する場合、クライアントアプリケーションは、次のようにサブクエリからの結果も処理する必要があります。
- Account オブジェクトにクエリを実行します。
- queryMore() で取引先 QueryResult を反復処理します。
- 各取引先オブジェクトについては、取引先責任者オブジェクトの QueryResult を取得します。
- 各取引先責任者の QueryResult で queryMore() を使用して子取引先責任者を反復処理します。
次のサンプルは、サブクエリ結果を処理する方法を示しています。
1swfobject.registerObject("clippy.codeblock-2", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17private void querySample() {
18
19 QueryResult qr = null;
20
21 try {
22
23 qr = connection.query("SELECT a.Id, a.Name, " +
24
25 "(SELECT c.Id, c.FirstName, " +
26
27 "c.LastName FROM a.Contacts c) FROM Account a");
28
29 boolean done = false;
30
31 if (qr.getSize() > 0) {
32
33 while (!done) {
34
35 for (int i = 0; i < qr.getRecords().length; i++) {
36
37 Account acct = (Account) qr.getRecords()[i];
38
39 String name = acct.getName();
40
41 System.out.println("Account " + (i + 1) + ": " + name);
42
43 printContacts(acct.getContacts());
44
45 }
46
47 if (qr.isDone()) {
48
49 done = true;
50
51 } else {
52
53 qr = connection.queryMore(qr.getQueryLocator());
54
55 }
56
57 }
58
59 } else {
60
61 System.out.println("No records found.");
62
63 }
64
65 System.out.println("\nQuery succesfully executed.");
66
67 } catch (ConnectionException ce) {
68
69 System.out.println("\nFailed to execute query successfully, error message " +
70
71 "was: \n" + ce.getMessage());
72
73 }
74
75}
76
77
78
79private void printContacts(QueryResult qr) throws ConnectionException {
80
81 boolean done = false;
82
83 if (qr.getSize() > 0) {
84
85 while (!done) {
86
87 for (int i = 0; i < qr.getRecords().length; i++) {
88
89 Contact contact = (Contact) qr.getRecords()[i];
90
91 String fName = contact.getFirstName();
92
93 String lName = contact.getLastName();
94
95 System.out.println("Child contact " + (i + 1) + ": " + lName
96
97 + ", " + fName);
98
99 }
100
101 if (qr.isDone()) {
102
103 done = true;
104
105 } else {
106
107 qr = connection.queryMore(qr.getQueryLocator());
108
109 }
110
111 }
112
113 } else {
114
115 System.out.println("No child contacts found.");
116
117 }
118
119}
120
121