問題
組織には「NoContacts」という名前の単一の取引先があり、関連する取引先責任者はありません。
以下のApexを実行した結果はどうなりますか。
List<Account> accounts = [
SELECT Name, (SELECT Id, Name FROM Contacts)
FROM Account
WHERE Name = 'NoContacts'
];
- QueryExceptionがスローされます。
- accounts[0].contactsは空です。
- accounts[0].contactsはNullです。
- accounts[0].contactsは無効です。
正解
- QueryExceptionがスローされます。
- accounts[0].contactsは空です。
- accounts[0].contactsはNullです。
- accounts[0].contactsは無効です。
解説
それぞれの選択肢の理由について説明します。
□ QueryExceptionがスローされます。
これは不正解です。提供されたApexコードは正しいSOQLクエリを使用しており、NoContacts
という名前の取引先が存在する場合、このクエリは問題なく実行されます。取引先責任者がいない場合でもQueryExceptionはスローされません。Salesforceでは、子関係クエリが結果を返さない場合は単に空のリストが返されます。
□ accounts[0].contactsは空です。
これは正解です。サブクエリ (SELECT Id, Name FROM Contacts)
は関連する取引先責任者のレコードを取得しようとしますが、NoContacts
という名前の取引先に関連する取引先責任者がいないため、このリストは空になります(つまり、要素が0個です)。しかし、これはnullではなく、空のリスト(List<Contact>)です。
□ accounts[0].contactsはNullです。
これは不正解です。SalesforceのSOQLクエリで子関係をクエリすると、その子関係が空であったとしても、nullではなく空のリストが返されます。ですので、このリストはnullではなく、上記の通り空です。
□ accounts[0].contactsは無効です。
これは不正解です。accounts[0].contacts
が無効という状態は存在しません。Salesforceでは、このようなクエリ結果は正しく扱われ、結果がない場合は単に空のリストが返されます。無効という状態は特にこのコンテキストには当てはまりません。
コメント