問題
以下のコードから、コントローラ変数を作成するために使用できるステートメントはどれですか。3つ選びなさい。
public class AccountListController {
public List<Account> getAccounts() {
return controller.getRecords();
}
}
- Apexpages.standardsetcontroller controller = new apexpages.standardsetcontroller(database.query(‘select id from account’));
- Apexpages.standardsetcontroller controller = new apexpages.standardsetcontroller(database.getquerylocator(‘select id from account’));
- Apexpages.standardcontroller controller = new apexpages.standardcontroller(database.getquerylocator(‘select id from account’));
- Apexpages.standardcontroller controller = new apexpages.standardcontroller([select id from account]);
- Apexpages.standardsetcontroller controller = new apexpages.standardsetcontroller(database.getquerylocator([select id from account]));
正解
- Apexpages.standardsetcontroller controller = new apexpages.standardsetcontroller(database.query(‘select id from account’));
- Apexpages.standardsetcontroller controller = new apexpages.standardsetcontroller(database.getquerylocator(‘select id from account’));
- Apexpages.standardcontroller controller = new apexpages.standardcontroller(database.getquerylocator(‘select id from account’));
- Apexpages.standardcontroller controller = new apexpages.standardcontroller([select id from account]);
- Apexpages.standardsetcontroller controller = new apexpages.standardsetcontroller(database.getquerylocator([select id from account]));
解説
この問題のポイントは、StandardController
とStandardSetController
のコンストラクタに正しいタイプの引数を正確に渡しているかどうかを判断することです。
- StandardController
- 目的: 単一のsObjectレコードに対する操作をサポートするためのコントローラ
- 受け取ることができる値: 単一のsObjectレコード
- 使用例:
Account acc = [SELECT Id, Name FROM Account LIMIT 1];
ApexPages.StandardController sc = new ApexPages.StandardController(acc);
注意: StandardController
のコンストラクタに渡すSOQLクエリは、1つのレコードのみを返すようにする必要があります。もしクエリが複数のレコードを返す場合、エラーが発生します。
- StandardSetController
- 目的: sObjectのリストに対する操作をサポートするためのコントローラ。
- 受け取ることができる値: sObjectのリストまたは
Database.QueryLocator
オブジェクト。 - 使用例:
sObjectのリストを使用する場合:
Account acc = [SELECT Id, Name FROM Account LIMIT 1];
ApexPages.StandardController sc = new ApexPages.StandardController(acc);
Database.QueryLocator
を使用する場合:
ApexPages.StandardSetController ssc = new ApexPages.StandardSetController(Database.getQueryLocator('SELECT Name FROM Account LIMIT 20'));
それぞれの選択肢の理由について説明します。
□ Apexpages.standardsetcontroller controller = new apexpages.standardsetcontroller(database.query(‘select id from account’));
これは正解です。StandardSetControllerは、sObjectのリストを引数として受け取ることができます。このステートメントでは、database.queryを使用してAccountのIDを取得し、それをStandardSetControllerのコンストラクタに渡しています。
□ Apexpages.standardsetcontroller controller = new apexpages.standardsetcontroller(database.getquerylocator(‘select id from account’));
これは正解です。StandardSetControllerは、Database.QueryLocatorオブジェクトを引数として受け取ることもできます。このステートメントでは、database.getquerylocatorを使用してクエリロケータを取得し、それをStandardSetControllerのコンストラクタに渡しています。
□ Apexpages.standardcontroller controller = new apexpages.standardcontroller(database.getquerylocator(‘select id from account’));
これは不正解です。StandardControllerは、単一のsObjectレコードを引数として受け取る必要があります。Database.QueryLocatorオブジェクトは受け取れません。さらに、Database.QueryLocatorは複数のレコードを返す可能性がありますが、StandardControllerは単一のレコードのみを期待しています。
□ Apexpages.standardcontroller controller = new apexpages.standardcontroller([select id from account]);
これは不正解です。このステートメントは、SOQLクエリを使用して取引先オブジェクトのすべてのレコードのIDを取得しようとします。もし取引先オブジェクトに2つ以上のレコードが存在する場合、”List has more than 1 row for assignment to SObject”というエラーが発生します。StandardControllerのコンストラクタは、単一のsObjectレコードのみを受け取ることを期待しています。
□ Apexpages.standardsetcontroller controller = new apexpages.standardsetcontroller(database.getquerylocator([select id from account]));
これは正解です。Database.getQueryLocatorメソッドは、SOQLクエリ文字列または直接のSOQLクエリを引数として受け取ることができます。このステートメントでは、直接のSOQLクエリを使用してDatabase.getQueryLocatorを呼び出し、その結果をStandardSetControllerのコンストラクタに渡しています。
コメント