この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

リレーション項目および多態的な項目について

多態的なリレーションでは、リレーションの参照オブジェクトを複数の異なる種別のオブジェクトのいずれかにすることができます。

いくつかの項目はリレーション項目で、関連オブジェクトの情報を取得するために使用できます。これらのリレーション項目のいくつかは、多態的な項目です。多態的な項目とは、関連オブジェクトを複数の異なる種別のオブジェクトのいずれかにできる項目です。たとえば、Task の Who リレーション項目には、Contact または Lead のいずれかを使用できます。

項目の種類を確認するには、オブジェクトに対して describeSObjects() をコールし、その項目のプロパティを調べます。
  1. relationshipName が null でない場合、項目はリレーション項目です。
  2. また、namePointing が true、polymorphicForeignKey が true、referenceTo の参照されるオブジェクト種別が複数ある場合、項目は多態的な項目です。

リレーション項目の例

Account オブジェクトの OwnerId 項目には、次のプロパティがあります。
  • relationshipName = Owner
  • namePointing = false
  • referenceTo = User
これは、リレーション項目であることを示しています。relationshipName は、関連オブジェクトに関する情報を取得するための擬似項目として使用します。この種別は、referenceTo 項目で指定されます。たとえば、次の SOQL クエリを使用できます。
1SELECT Id, Owner.Name FROM Account

項目の名前 (OwnerId) ではなく、リレーションの名前 (Owner) を使用してください。

メモ

多態的な項目の例

Event オブジェクトの OwnerId 項目には、次のプロパティがあります。
  • relationshipName = Owner
  • namePointing = true
  • polymorphicForeignKey = true
  • referenceTo = Calendar, User

これは、多態的な項目であることを示しています。Owner は、Calendar または User にすることができます。たとえば、次の SOQL クエリを使用できます。

1SELECT Id, Owner.Name FROM Event WHERE Owner.Type = 'User'

多態的な項目の使用

多態的な項目は、複数の方法で使用できます。
  • リレーションの多態的な項目を使用する。
  • 多態的な項目で Type 修飾子を使用する。
  • クエリで TYPEOF 句を使用する。
複雑なクエリの場合は、これらの方法を組み合わせることもできます。

よく使用される多態的な項目

よく使用される多態的な項目には、次のものがあります。

  • Owner: この項目は、レコードの親を表します。次に例を示します。
    1SELECT Id, Owner.Name
    2FROM Task
    3WHERE Owner.FirstName like 'B%'

    このクエリ例は、Calendar または User のいずれかを所有者とする ToDo レコードに対して機能します。

  • Who: この項目は、レコードに関連付けられている個人を表します。次に例を示します。
    1SELECT Id, Who.FirstName, Who.LastName
    2FROM Task
    3WHERE Owner.FirstName LIKE 'B%'

    このクエリ例は、所有者が Calendar または User のいずれかで、Who 項目が Contact または Lead のいずれかである ToDo レコードに対して機能します。

    クエリで返されるオブジェクトの種別を確認するには、Who.Type を使用します。次に例を示します。

    1SELECT Id, Who.Id, Who.Type
    2FROM Task

    この例を使用して、Contact に関連付けられたすべての ToDo を照会できます。

    1SELECT Id, Who.Id, Who.Type
    2FROM Task
    3WHERE Who.Type='Contact'
  • What: この項目は、レコードに関連付けられている、人以外のオブジェクトを表します。次に例を示します。
    1SELECT Id, What.Name
    2FROM Event

    このクエリ例は、What が Account もしくは Solution、または別の番号の任意のオブジェクト種別になる場合がある Event に対して機能します。

Type 修飾子の使用

Type 修飾子を項目で使用すると、多態的なリレーションの参照対象のオブジェクト種別を判別できます。参照対象のオブジェクト種別に応じてクエリから返される内容を条件に基づいて制御するには、SELECT ステートメントの WHERE 句で Type 修飾子を使用します。次の SELECT ステートメントでは、Type が使用され、Event の What 項目に基づいてクエリが絞り込まれます。
1SELECT Id
2FROM Event
3WHERE What.Type IN ('Account', 'Opportunity')
実行時に、この SELECT ステートメントは What 項目で Account または Opportunity を参照する Event の ID を返します。Event が What 項目で Campaign を参照している場合は、この SELECT の一部としては返されません。TYPEOF 式とは異なり、オブジェクト種別は文字列として Type から返されます。オブジェクト種別の文字列には、= (次の文字列と一致する) や LIKE など、任意の WHERE 比較演算子を適用できます。

TYPEOF の使用

SOQL では、SELECT ステートメントで TYPEOF 式を使用して、多態的なリレーションをサポートします。TYPEOF は、API バージョン 46.0 以降で使用できます。(これは、開発者プレビューの一部として API バージョン 26.0 以降で使用することもできます。)

多態的なリレーションの各オブジェクト種別に対して照会する項目を制御するには、SELECT ステートメントで TYPEOF を使用します。次の SELECT ステートメントは、Event の多態的な What リレーション項目に関連付けられたオブジェクト種別に応じて、さまざまな項目のセットを返します。
1SELECT 
2  TYPEOF What
3    WHEN Account THEN Phone, NumberOfEmployees
4    WHEN Opportunity THEN Amount, CloseDate
5    ELSE Name, Email
6  END
7FROM Event
実行時に、この SELECT ステートメントは、Event の What 項目で参照されるオブジェクト種別を確認します。オブジェクト種別が Account の場合、参照対象の Account の Phone 項目と NumberOfEmployee 項目が返されます。オブジェクト種別が Opportunity の場合、参照対象の Opportunity の Amount 項目と CloseDate 項目が返されます。オブジェクト種別がこれら以外の種別である場合、Name 項目と Email 項目が返されます。ELSE 句が指定されていなくて、オブジェクト種別が Account でも Opportunity でもない場合、その Event には null が返されます。

TYPEOF の考慮事項について、次の点を注意してください。

  • namePointing 属性が false のリレーションで TYPEOF を使用することはできません。
  • relationshipName 属性が false のリレーションで TYPEOF を使用することはできません。
  • TYPEOF は、クエリの SELECT 句でのみ使用できます。WHERE 句で Type 修飾子を使用して、多態的なリレーションのオブジェクト種別を絞り込むことができます。詳細は、「多態的なリレーション項目の絞り込み」を参照してください。
  • TYPEOF は、COUNT() など、オブジェクトを返さないクエリでは使用できません。
  • TYPEOF は、ストリーミング API PushTopic のベースの SOQL クエリでは使用できません。
  • TYPEOF は、Bulk API で使用される SOQL では使用できません。
  • TYPEOF 式はネストできません。たとえば、TYPEOF 式の WHEN 句内で別の TYPEOF を使用することはできません��
  • TYPEOF は、準結合クエリSELECT 句では使用できません。準結合クエリを含む外側のクエリの SELECT 句では TYPEOF を使用できます。次の例は、TYPEOF が準結合クエリで使用されているため無効です。
    1SELECT Name FROM Account
    2WHERE CreatedById IN
    3    (
    4    SELECT 
    5        TYPEOF Owner
    6            WHEN User THEN Id
    7            WHEN Group THEN CreatedById
    8        END
    9    FROM CASE
    10    )
    TYPEOF が外側の SELECT 句のみで使用されているため、次の例は有効です。
    1SELECT 
    2    TYPEOF What
    3        WHEN Account THEN Phone
    4        ELSE Name
    5    END
    6FROM Event
    7WHERE CreatedById IN
    8    (
    9    SELECT CreatedById
    10    FROM Case
    11    )
  • TYPEOF は、SELECT 句で関数を含むクエリでは使用できません。次の例は、TYPEOFFORMAT 関数が含まれているため無効です。
    1SELECT
    2 TYPEOF What
    3  WHEN Account THEN Id, FORMAT(LastModifiedDate) LastModifiedDate__f
    4  WHEN Oppty THEN Id
    5 END
    6FROM Task
    代わりに、同じクエリを関数を使わずに実行して ID のリストを取得します。
    1SELECT
    2    TYPEOF What
    3        WHEN Account THEN Id, LastModifiedDate
    4        WHEN Opportunity THEN Id
    5    END
    6FROM Task
    次に、結果の ID リストに対して、関数を使用する 2 番目のクエリを実行します。
    1SELECT 
    2    FORMAT(LastModifiedDate) LastModifiedDate__f 
    3FROM Account 
    4WHERE Id in RetrievedIdList
  • TYPEOF は、GROUP BYGROUP BY ROLLUPGROUP BY CUBE、および HAVING を含むクエリでは使用できません。

TYPEOFType の併用

SELECT ステートメントでは、TYPEOFType を組み合わせて使用できます。次の SELECT ステートメントでは、TYPEOFType の両方が使用され、Event の What 項目に基づいてクエリが絞り込まれ、返された項目セットがさらに絞り込まれます。
1SELECT Id,
2  TYPEOF What
3    WHEN Account THEN Phone
4    WHEN Opportunity THEN Amount
5  END
6FROM Event
7WHERE What.Type IN ('Account', 'Opportunity')
実行時に、この SELECT ステートメントは必ず Event の ID を返し、次に Event の What 項目で参照されるオブジェクト種別に応じて Account.Phone または Opportunity.Amount のいずれかを返します。ELSE 句は指定されていません。このステートメントは、WHERE 句の What 項目に基づいて絞り込みを行うため、Account か Opportunity のいずれかを参照する Event のみが返されます。そのため、ELSE 句は必要ありません。この場合に ELSE 句が含まれていると、実行時に無視されます。

WSDL のオブジェクト種別

Enterprise および Tooling API WSDL の場合、多態的な項目のオブジェクト種別は、API のバージョンによって異なります。
  1. API バージョン 46.0 以降 (および SOQL Polymorphism 機能の開発者プレビュー部分が有効であるバージョン) の場合、オブジェクト種別は sObject です。次に例を示します。
    1<complexType name="Task">
    2  <complexContent>
    3    <extension base="ens:sObject">
    4      <sequence>
    5      ...
    6      <element name="Owner" nillable="true" minOccurs="0" type="ens:sObject"/>
    7      ...
    8      </sequence>
    9    </extension>
    10  </complexContent>
    11</complexType>
  2. その他のバージョンの場合、種別は Name です。次に例を示します。
    1<complexType name="Task">
    2  <complexContent>
    3    <extension base="ens:sObject">
    4      <sequence>
    5      ...
    6      <element name="Owner" nillable="true" minOccurs="0" type="ens:Name"/>
    7      ...
    8      </sequence>
    9    </extension>
    10  </complexContent>
    11</complexType>
これは、これらの WSDL から生成された Java コードに影響を与えます。たとえば、Task.java の場合、Owner 項目は、現在次のように定義されています。
1private com.sforce.soap.enterprise.sobject.SObject Owner;
WSDL ファイルから Java コードを生成する方法についての詳細は、「Java 開発者環境の設定」を参照してください。