項目が存在するにもかかわらず「No such column on entity」エラーが発生する原因と解決策

By | October 26, 2020

可能な原因

①API参照名が誤っている
②ユーザ(特にシステム管理者)が当該の項目に対する参照権を持っていない
③当該の項目がPolymorphic Fieldである

チェックすべきこと

①API参照名が間違っていないか
②当該項目の項目レベルセキュリティにおいて、必要なユーザのプロファイル(特にシステム管理者)に対して参照権限が付与されているか
③当該の項目がPolymorphic Fieldではないか

項目レベルセキュリティの付与方法

①「右上の歯車ボタン>オブジェクトマネージャ>当該のオブジェクト>項目とリレーション>当該の項目>項目レベルセキュリティの設定」の順にクリック

②システム管理者を含め、権限が必要なユーザに対して「参照可能」権限を付与

Polymorphic Fieldであるかどうかの確認方法

①「右上の歯車ボタン>オブジェクトマネージャ>当該のオブジェクト>項目とリレーション」の順にクリック

②当該の項目のデータ型として、複数オブジェクトへの参照が記載されている場合、当該項目はPolymorphic Fieldである。

SOQLを用いたPolymorphic Fieldの値の取得方法

SOQL内でTYPEOFを利用してPolymorphic Fieldの値を取得した上で、必要なsObjectのインスタンスを作成してそれを利用する。

例:Task(日本語訳:ToDo笑)の参照先ContactのFirstNameを取得したい場合

List<Task> taskList = [SELECT TYPEOF WhoId WHEN Contact THEN FirstName END FROM Task];
for(Task task: taskList){
 if(task.WhoId instanceOf Contact){
  Contact con = task.WhoId;
  system.debug(con.FirstName);
 }
}

↓ポイントとなる部分を抽出したver.

Task task = [SELECT TYPEOF WhoId WHEN Contact THEN FirstName END FROM Task LIMIT 1];
Contact con = task.WhoId;
system.debug(con.FirstName);

参考

Understanding Relationship Fields and Polymorphic Fields