Apex-soql

提供:Dev Guides
移動先:案内検索

Apex-SOQL

これは、SFDCデータベースで動作するように設計されたSalesforceオブジェクトクエリ言語です。 単一のsObjectでのみ、指定された基準でレコードを検索できます。

SOSLと同様に、複数のオブジェクトを検索することはできませんが、ネストされたクエリをサポートします。

SOQLの例

化学会社の継続的な例を考えてみましょう。 今日作成され、顧客名が「test」ではないレコードのリストが必要だとします。 この場合、以下に示すようにSOQLクエリを使用する必要があります-

//fetching the Records via SOQL
List<apex_invoice__c> InvoiceList = new List<apex_invoice__c>();
InvoiceList = [SELECT Id, Name, APEX_Customer__r.Name, APEX_Status__c FROM
   APEX_Invoice__c WHERE createdDate = today AND APEX_Customer__r.Name != 'Test'];
//SOQL query for given criteria

//Printing the fetched records
System.debug('We have total '+InvoiceList.size()+' Records in List');

for (APEX_Invoice__c objInvoice: InvoiceList) {
   System.debug('Record Value is '+objInvoice);
  //Printing the Record fetched
}

以下に示すように、開発者コンソールのクエリエディターからSOQLクエリを実行できます。

開発者コンソールで以下のクエリを実行します。 今日作成された請求書レコードを検索します。

SELECT Id, Name, APEX_Customer__r.Name, APEX_Status__c FROM APEX_Invoice__c
   WHERE createdDate = today

値が必要なフィールドを選択する必要があります。そうしないと、ランタイムエラーがスローされる可能性があります。

関係フィールドの横断

これはSFDCで最も重要な部分の1つです。親子オブジェクトの関係を何度も走査する必要があるためです。

また、データベースに2つの関連オブジェクトレコードを挿入する必要がある場合があります。 たとえば、請求書オブジェクトは顧客オブジェクトと関係があるため、1人の顧客が多くの請求書を持つことができます。

請求書を作成していて、この請求書を顧客に関連付ける必要があるとします。 この機能には次のコードを使用できます-

//Now create the invoice record and relate it with the Customer object
//Before executing this, please create a Customer Records with Name 'Customer
//Creation Test'
APEX_Invoice__c objInvoice = new APEX_Invoice__c();

//Relating Invoice to customer via id field of Customer object
objInvoice.APEX_Customer__c = [SELECT id FROM APEX_Customer__c WHERE Name =
   'Customer Creation Test' LIMIT 1].id;
objInvoice.APEX_Status__c = 'Pending';
insert objInvoice; //Creating Invoice
System.debug('Newly Created Invoice'+objInvoice); //Newly created invoice

開発者コンソールでこのコードスニペットを実行します。 実行されたら、開発者コンソールから請求書のIDをコピーし、次に示すようにSFDCで同じものを開きます。 以下に示すように、親レコードがすでに請求書レコードに割り当てられていることがわかります。

親レコードのフェッチSOQL

子レコードの取得

ここで、特定の顧客レコードに関連するすべての請求書を1か所にまとめる必要がある例を考えてみましょう。 このためには、子関係の名前を知っている必要があります。 子関係名を表示するには、子オブジェクトのフィールド詳細ページに移動し、「子関係」値を確認します。 この例では、最後に__rが追加された請求書です。

この例では、データを設定し、「ABC Customer」レコードとして名前を持つ顧客を作成し、その顧客に3つの請求書を追加する必要があります。

ここで、顧客「ABC顧客」の請求書を取得します。 以下は、同じクエリです-

//Fetching Child Records using SOQL
List<apex_customer__c> ListCustomers = [SELECT Name, Id,
   (SELECT id, Name FROM Invoices__r) FROM APEX_Customer__c WHERE Name = 'ABC Customer'];

//Query for fetching the Child records along with Parent
System.debug('ListCustomers '+ListCustomers);//Parent Record

List<apex_invoice__c> ListOfInvoices = ListCustomers[0].Invoices__r;
//By this notation, you could fetch the child records and save it in List
System.debug('ListOfInvoices values of Child '+ListOfInvoices);
//Child records

デバッグログでレコード値を確認できます。

親レコードの取得

作成日が今日である請求書の顧客名を取得する必要があると仮定します。それから、以下のクエリを使用して同じことができます-

子オブジェクトとともに親レコードの値を取得します。

//Fetching Parent Record Field value using SOQL
List<apex_invoice__c> ListOfInvoicesWithCustomerName = new List<apex_invoice__c>();
ListOfInvoicesWithCustomerName = [SELECT Name, id, APEX_Customer__r.Name
   FROM APEX_Invoice__c LIMIT 10];

//Fetching the Parent record's values
for (APEX_Invoice__c objInv: ListOfInvoicesWithCustomerName) {
   System.debug('Invoice Customer Name is '+objInv.APEX_Customer__r.Name);
  //Will print the values, all the Customer Records will be printed
}

ここでは、表記APEX_Customerr.Nameを使用しました。APEX_Customerrは親関係名です。ここでは、Parentフィールドの最後に__rを追加する必要があり、その後、親フィールドの値を取得できます。

集約関数

SOQLには、SQLにあるような集約関数があります。 集計関数を使用すると、データをロールアップして集計できます。 関数を詳細に理解しましょう。

顧客「ABC顧客」から得ている平均収益が何であるかを知りたい場合、この関数を使用して平均を取得できます。

//Getting Average of all the invoices for a Perticular Customer
AggregateResult[] groupedResults = [SELECT
   AVG(APEX_Amount_Paid__c)averageAmount FROM APEX_Invoice__c WHERE
   APEX_Customer__r.Name = 'ABC Customer'];
Object avgPaidAmount = groupedResults[0].get('averageAmount');
System.debug('Total Average Amount Received From Customer ABC is '+avgPaidAmount);

デバッグログの出力を確認します。 集計関数を含むクエリは、結果を AggregateResult オブジェクトの配列で返すことに注意してください。 AggregateResultは読み取り専用のsObjectであり、クエリ結果にのみ使用されます。 大きなデータに関するレポートを生成する必要がある場合に役立ちます。

データ集計を実行するために使用できる他の集計関数もあります。

  • MIN()*-これは最小値を見つけるために使用できます
  • MAX()*-これは最大値を見つけるために使用できます。

Apex変数のバインド

SOQLクエリでApex変数を使用して、目的の結果を取得できます。 Apex変数は、コロン(:)表記で参照できます。

//Apex Variable Reference
String CustomerName = 'ABC Customer';
List<apex_customer__c> ListCustomer = [SELECT Id, Name FROM APEX_Customer__c
   WHERE Name = :CustomerName];

//Query Using Apex variable
System.debug('ListCustomer Name'+ListCustomer);//Customer Name