SOSLの戻り値
SOQLに比べあまり馴染みがない、SOSLについて。まずは基本的な使い方。
SOSLをApexで扱う時は、戻り値はList<List<SObject>>型で返却されます。
取引先と取引先責任者に対し、すべての項目でキーワード「hoge」が含まれているレコードを抽出するには以下のようなSOSLになります。
使用例)
List<List<Sobject>> searchList = [FIND 'hoge' IN ALL FIELDS RETURNING Account(Name), Contact(FirstName,LastName)];
オブジェクト毎にリストに纏められます。
検索結果をループする場合
SOSLをfor文で使用することも可能です。
ただし、オブジェクトの組み合わせにより、for文でループできるリスト型が変わってきます。
これが一番スタンダードかつ安全なループの仕方。
for(List<Sobject> objList : [FIND 'hoge' IN ALL FIELDS RETURNING Account(Name), Contact(FirstName,LastName)]){ // ループ処理 // 1周目はAccount、2周目はContactのリスト for(SObject rec: objList ]){ // ループ処理 } }
このSOSLはAccountとContactを対象にしているため、下記のように記述するとエラーになります。
(Contact側の検索結果がListにキャストできないので)
for(List<Account> accList : [FIND 'hoge' IN ALL FIELDS RETURNING Account(Name), Contact(FirstName,LastName)]){ // ループ処理 }
このSOSLは検索対象のオブジェクトが1つしかない場合は、オブジェクトのリストを指定してキャストすることができます。
for(List<Account> accList : [FIND 'hoge' IN ALL FIELDS RETURNING Account(Name)]){ // ループ処理 }
※ここまでくると、あまりfor文で扱う意味がない気がするのですが、一応こういう形もできるよってことで覚えておいてください。
Query Editorでは書き方が違う
ちなみに、ここで記載したSOSLはApex用の記述です。
開発コンソールのQuery Editorではキーワードの部分を中括弧でくくってください。
FIND {hoge} IN ALL FIELDS RETURNING Account(Name), Contact(FirstName,LastName)
コメント