EntityModelのリストを取得する効率的な方法(Java、DXA 2.0)
Oct 28 2020
特定の基準でエンティティを照会するページがあります。
これを実装する方法は、エンティティIDのリストを取得し、IDをループして、IDごとにエンティティモデルを取得し、それをリストに追加することです。
擬似コード:
Query query = new Query(...);
// Get list of ids from query
List<String> ids = Arrays.asList(query.executeQuery());
final WebComponentMetaFactory cmf = new WebComponentMetaFactoryImpl(brokerQuery.getPublicationId());
// Get component meta
List<ComponentMeta> componentMetas = ids.stream().map(cmf::getMeta)
.collect(Collectors.toList());
// Get entity model per component and add it to the list
componentMetas.forEach(meta -> {
EntityModel entityModel = contentProvider.getEntityModel(meta.getId() + templateId, webRequestContext.getLocalization())
list.add(entityModel)
});
これは機能しますがcontentProvider.getEntityModel(...)、すべてのIDを呼び出す必要があるため、パフォーマンスの観点からは非常に低速です。
これに対するより良い解決策はありますか?おそらく、EntityModelのリストを生成するDXAのAPIですか?
回答
Velmurugan Nov 03 2020 at 06:06
以下のCILAPIを使用して、単一の呼び出しで複数のDCPコンテンツをフェッチします。以下に示す例は、Javaでも利用可能な.NET同様のAPIに基づいています。
string[] componentUris = query.ExecuteQuery();
var components =
componentUris
.Select(componentUri => { TcmUri uri = new TcmUri(componentUri); return (ComponentPresentation)new ComponentPresentationFactory(uri.PublicationId).FindAllComponentPresentations(componentUri)[0]; })
.Where(cp => cp != null)
.Select(cp => cp.Content)
.ToList();
お役に立てば幸いです。