Salesforceのカスタムメタデータ型は、設定情報やマスタデータを管理するのに非常に便利な仕組みです。しかし、SOQLクエリを利用する際、ORDER BY句で指定する項目がSELECT句に含まれていない場合、期待したソート順が保証されないという不具合が報告されています。
参照ページ:
https://issues.salesforce.com/issue/a028c00000qQ0UFAA0/custom-metadata-type-not-being-sorted-as-expected
この記事では、この問題の詳細と具体的な回避策について解説します。

不具合の概要
この不具合は、カスタムメタデータ型に対してSOQLでクエリを実行する際、ORDER BY句に指定した項目がクエリのSELECT句に明示的に含まれていない場合、ソート順が意図した通りに並ばないという現象です。
通常、SOQLではORDER BY句の指定に基づいてレコードが並び替えられますが、カスタムメタデータ型の場合は例外的な挙動となっています。
技術的背景
クエリ最適化の影響
一般的なオブジェクトに対するSOQLクエリでは、SELECT句で取得する項目とORDER BY句で指定する項目が必ずしも一致しなくても、正しいソート結果が得られます。しかし、カスタムメタデータ型では内部処理の最適化により、ORDER BY句で指定された項目がSELECT句に含まれていない場合、ソート順が保証されないという動作が発生しています。
カスタムメタデータ型の特性
カスタムメタデータ型は、通常のカスタムオブジェクトとは異なるキャッシュ戦略やクエリエンジンが採用されているため、クエリの実行方法や結果の並び替えの処理が特殊です。具体的には、ORDER BYで利用する項目がクエリ結果に含まれていない場合、内部的な最適化によりソート順が不定となる可能性があります。
開発コミュニティでの検証
Qiitaなどの開発者コミュニティでは、同様の現象が報告されており、実際にORDER BY句で指定する項目をSELECT句に追加することで、期待するソート順が得られることが確認されています。
これにより、現状の不具合は回避可能であると実証されています。
参照ページ:
https://qiita.com/TaaaZyyy/items/5bb62217f3cb1779aed1
影響と回避策
この不具合により、カスタムメタデータ型のレコードを特定の順序で取得する必要がある場合、必ずORDER BYで指定する項目をSELECT句に含める必要があります。具体的な回避策としては、以下のようにクエリを修正します。
-- 不具合が発生する例
SELECT DeveloperName
FROM CustomMetadata__mdt
ORDER BY SortField__c
-- 回避策:ORDER BYで利用する項目もSELECT句に追加する
SELECT DeveloperName, SortField__c
FROM CustomMetadata__mdt
ORDER BY SortField__c
この方法で、クエリ実行時に内部処理の最適化による影響を回避し、意図したソート順でレコードを取得できます。
テストクラスの問題
なお、この現象はテストクラスで検出できない場合があります。以下は、テストクラスで不具合が検出できなかった理由について、確度が高い順に並べたものです。各理由はあくまで現状の情報や開発者コミュニティでの議論に基づく推定となります。
テストクラスで検出できなかった理由
- アサーションが順序を検証していない(確度:高)
テストクラスでは、主にレコードの件数や存在そのものを検証するケースが多く、実際の並び順に関するアサーションが実装されていないことがあります。そのため、ORDER BYの結果のソート順が期待通りになっていなくても、テストとしては合格してしまいます。 - テストデータの性質(確度:中)
テストクラスで使用されるデータは、通常シンプルで制御されたものが使われるため、実運用時のような複雑な並び替えの問題が再現されにくいという点も影響しています。 - テスト実行時の内部処理の違い(確度:中)
Salesforceのテストクラスはシステムモードで実行されるため、本番環境とは異なるキャッシュ処理や内部最適化が働く場合があります。これにより、実際の運用環境では発生するORDER BYの不具合がテスト環境では顕在化しない可能性があります。
まとめ
Salesforceのカスタムメタデータ型におけるORDER BY句の不具合は、内部処理の最適化に起因するものであり、ORDER BY句で指定する項目をSELECT句に含めることで回避可能です。
システム開発や運用において、正確なデータ取得が求められる場合は、この点に十分注意する必要があります。
今後、Salesforce側での修正が期待されますが、現状は回避策を取り入れることが推奨されます。