SOSLを使用したループ処理

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)

コメント