SalesforceのLocation型の違いとは?Addressからのキャストの仕組みを解説

SalesforceにおけるLocation型の違いとAddressのキャストについて

1. Locationの2つの意味

Salesforceでは「Location」という名前が 2つの異なる用途 で使用されています。

  1. LocationオブジェクトSchema.Location

    • 物理的な場所を表すオブジェクト

    • SELECT Id FROM Location のようなSOQLで取得できる

  2. LocationクラスLocation

    • 地理的な緯度・経度情報 を持つクラス

    • BillingAddressShippingAddress などの Address型のフィールドと互換性 がある


2. Address を Location クラスにキャストできる理由

Address は Salesforce の特殊な型であり、Location クラスに変換できます。例えば、次のようなコードは問題なく動作します。

Account acc = [SELECT BillingAddress FROM Account LIMIT 1];

Location billingLocation = acc.BillingAddress; // 変換可能

このキャストが可能な理由は、Address 型のフィールドは内部的に Location クラスと互換性があるためです。
Location クラスには latitude(緯度)や longitude(経度)のプロパティが含まれています。

System.debug('Latitude: ' + billingLocation.latitude);
System.debug('Longitude: ' + billingLocation.longitude);

3. なぜ Location を SOQL で取得するとエラーになるのか?

Location という名前が クラスとオブジェクトの両方で使用されているため、そのまま SELECT Id FROM Location を実行すると、Salesforceは Location クラスと誤認識し、コンパイルエラーを引き起こします。

エラーとなるコード

List locations = [SELECT Id FROM Location]; // エラー

理由: Location クラスはオブジェクトではなく、型として認識されるため。

正しく書く方法

Schema 名前空間を明示することで、Location オブジェクトとして取得できます。

List locations = [SELECT Id FROM Location]; // 正常動作

ポイント:

  • Schema.Location を明示することで、SOQL の Location がクラスではなくオブジェクトであることをSalesforceに伝えられる。

4. AddressとLocationを扱う際の注意点

項目 Location クラス Schema.Location (オブジェクト)
用途 地理情報(緯度・経度) Salesforce標準オブジェクト
キャスト可能 Address 型から変換可能 Address 型とは直接関係なし
SOQLでの取得 SOQL不可 SELECT Id FROM Location
使用例 BillingAddress の取得・緯度経度情報の処理 物理的な「場所」の管理

まとめ

  • Location には クラスとオブジェクトの2種類 ある
  • Address フィールドは Location クラスにキャスト可能(地理座標データが含まれるため)
  • SOQL で Location を取得する場合は Schema.Location を使用する必要がある

この違いを理解することで、Salesforceでの地理情報の管理やSOQLクエリのエラーを回避できます。

コメント