Developer

SOQLでレコードを取得する際に気をつけること【セールスフォース】

Developer
この記事は約2分で読めます。

こんにちは、アンダーソンです。
たまーにやってしまうミスがあったのでちょっと書いとこうと思いまして、
残しておきます。

スポンサーリンク

クエリやアクセスでのエラー

List has no rows for assignment to SObject

皆さんも何度か遭遇したことがあるかと思います。
例外として出るのですが、どのような時に出るのかをみてみましょう。

Account acc = [SELECT Id FROM Account WHERE Name LIKE '%テスト%'];

例えばテストという名前のAccountが2件あったとします。
その際にSOQLが返すのは2件なのに、accに入れられるのは1件なので
例外が発生します。
この対処法としては、

List<Account> accList = [SELECT Id FROM Account WHERE Name LIKE '%テスト%'];

配列に入れてあげればOKです。

List index out of bounds: n

次にこのリストに対して、存在しないインデックスに対してアクセスしてみます。

Account acc = accList[2];

このリストには2つしかレコードがない為、エラーになります。

SObject row was retrieved via SOQL without querying the requested field

では次はどのようなエラーでしょうか。
上記のコードを少し変えます。

List<Account> accList = [SELECT Id FROM Account WHERE Name LIKE '%テスト%'];
Account acc = accList[0];
String s = acc.Name;

この場合に、SOQL内でName項目を取得していない為、上記のエラーが出ます。
対策としてはSOQLで項目を取得しておくことです。

必要のない項目までクエリするのはパフォーマンスの低下につながりますが、
必要なものは取っておかないとエラーの原因になるので気をつけましょう。

まとめ

今回は短いですがかなり重要なことです。
なぜならVisualforceに表示させることができずにユーザには真っ白な画面にエラーの文言だけが
出されます。
こうならないためにも日頃からレコードの取得の仕方には気をつけておきましょう。

その他の開発に関する記事はこちらです。

Developerも含めた試験問題にチャレンジしてみましょう。

コメント