動的 SOQL
動的 SOQL は、Apex コードを使用して、実行時に SOQL 文字列の作成を参照します。動的 SOQL によって、さらに柔軟なアプリケーションの作成が可能になります。たとえば、エンドユーザの入力に基づいた検索を作成したり、さまざまな項目名のレコードを更新したりできます。
実行時に動的 SOQL クエリを作成するには、次のいずれかの方法で database query メソッドを使用します。
- クエリが 1 つのレコードを返すときに、1 つの sObject を返します。
1sObject s = Database.query(string_limit_1); - クエリが複数のレコードを返すときに、sObject のリストを返します。
1List<sObject> sobjList = Database.query(string);
通常の割り当てステートメントや for ループなど、インライン SOQL クエリが使用可能な場合はいつでも、database query メソッドを使用できます。結果は、静的 SOQL クエリの処理とほぼ同様の方法で処理されます。
動的 SOQL 結果は、Account や MyCustomObject__c、または汎用 sObject データ型などのように、具体的な sObject として指定できます。実行時に、システムは、クエリのタイプが宣言された変数の型と一致しているかどうか検証します。クエリが正しい sObject データ型を返さない場合、ランタイムエラーが発生します。これは、汎用 sObject から具体的な sObject を割り当てる必要がないことを意味します。
動的 SOQL クエリには、静的クエリと同じガバナ制限があります。ガバナ制限についての詳細は、「実行ガバナと制限」を参照してください。
SOQL クエリの構文の詳細は、『SOQL および SOSL リファレンス』の「Salesforce Object Query Language (SOQL)」を参照してください。
動的 SOQL に関する考慮事項
1String myTestString = 'TestName';
2List<sObject> sobjList = Database.query('SELECT Id FROM MyCustomObject__c WHERE Name = :myTestString');1MyCustomObject__c myVariable = new MyCustomObject__c(field1__c ='TestField');
2List<sObject> sobjList = Database.query('SELECT Id FROM MyCustomObject__c WHERE field1__c = :myVariable.field1__c');1String resolvedField1 = myVariable.field1__c;
2List<sObject> sobjList = Database.query('SELECT Id FROM MyCustomObject__c WHERE field1__c = :resolvedField1');SOQL インジェクション
SOQL インジェクションとは、ユーザが SOQL ステートメントをあなたのコードに渡すことで、あなたのアプリケーションで意図していなかったデータベースメソッドを実行する手法です。動的 SOQL ステートメントを構築するためにアプリケーションがエンドユーザ入力に依存し、入力が適切に処理されなかった場合、常に Apex コードで発生する可能性があります。
SOQL インジェクションを防ぐには、escapeSingleQuotes メソッドを使用します。このメソッドは、ユーザから渡される文字列のすべての単一引用符にエスケープ文字 (\) を追加します。このメソッドにより、すべての単一引用符を、データベースコマンドではなく、囲まれた文字列として処理します。