SAPUI5で開発していると、「ODataモデルのメタデータから特定のEntityのプロパティを取得したい」という場面があります。たとえば、動的にテーブルカラムを生成したい場合などです。
この記事では、Controller内でEntityのプロパティ情報を取得する方法を紹介します。
✅ 使用する前提
モデルはODataModel(v2)
メタデータは事前に読み込み済み(metadata.xmlにEntity定義が存在する)
モデル名はoModelとして例示
🧩 コード全文
以下が、Controller内でEntityのプロパティ情報を非同期で取得するコードです。
// メタデータから Entity のプロパティ情報を抽出
let oMetadataArr = await new Promise(
function (fResolve, fReject) {
oModel.getMetaModel().loaded().then(() => {
let oMetaModel = oModel.getMetaModel().getODataEntityType("Namespace.EntityName");
fResolve(oMetaModel?.property ?? []);
}).catch(fReject);
}
);
🔍 解説
oModel.getMetaModel()
ODataModelからメタモデル(MetaModel)を取得します。
ここにはEntityTypeやPropertyなどの情報が含まれています。
loaded().then(...)
メタデータの読み込みは非同期のため、loaded()で読み込み完了を待つ必要があります。
この中で安全にメタデータアクセスを行います。
getODataEntityType("Namespace.EntityName")
引数には 完全修飾名(Namespace付き) のEntity名が必要です。
例:"my.service.namespace.DestinationSet"
SAP GUIのODataメタデータ(metadata.xml)で確認できます。
?.property ?? []
取得できなかった場合に備え、nullチェック+空配列のデフォルトを指定しています。
🧪 使用例:プロパティ名だけ取得したい場合
js
let aPropNames = oMetadataArr.map(o => o.name);
// 例: ["ID", "Name", "Address", "Email"]
⚠️ 注意点
getODataEntityType() に渡す エンティティ名は正確に。
EntitySet名(例: "Destinations")ではなく、EntityType名(例: "ZC_DestinationsType")を指定します。
メタデータがまだ読み込まれていない段階でアクセスしようとすると、undefinedが返る可能性があります。
📝 おまけ:非async/await版(Promiseチェーン)
oModel.getMetaModel().loaded().then(() => {
let oMetaModel = oModel.getMetaModel().getODataEntityType("Namespace.EntityName");
let aProps = oMetaModel?.property ?? [];
console.log(aProps);
});
🙌 まとめ
SAPUI5では、MetaModelを使えば動的にEntityの情報を取得できます。
特にテーブルカラムの動的生成や、入力チェックの自動化など、柔軟なUI設計に役立ちます。