【Salesforce】invalid query locator
SalesforceのApexで、SOQLで取得したレコードを参照した際にエラーが発生しました。
1 |
invalid query locator |
無効なクエリロケータとのことです。
調べてみると、ちゃんとありました。
https://help.salesforce.com/articleView?id=000323582&language=ja&type=1&mode=1
今回はバッチのstartで使用したクエリロケータが原因だったようです。
startメソッドではサブクエリによって子レコードを取得しており、それを参照した際にエラーが発生しました。
1 2 3 4 5 6 |
for(Account acc : accounts){ for(Contact contact : acc.Contacts){ // ここでエラー // 処理 } } |
修正としては、サブクエリで取得している部分を別のSOQLで取得するようにして解決しました。
イメージ的にはこんな感じです。
事前に取引先のIDから取引先責任者のリストを取得するMapを作成しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
for(Account acc : accounts){ List contactList; // 子レコードを取得する contactList = new List(); if(accountContactMap.containsKey(acc.Id)){ contactList = accountContactMap.get(acc.Id); } for(Contact contact : contactList){ // 処理 } } |
サブクエリを使用する際には注意が必要なんですね。
特に、バッチのstartで返すクエリロケータには使用厳禁のようです。
私自身はサブクエリをあまり使用しませんが、エラーの調査を依頼された場合は疑ってみます。
No comments.