Moyen efficace d'obtenir la liste d'EntityModel (Java, DXA 2.0)
Oct 28 2020
Nous avons une page qui interroge les entités avec certains critères.
La façon dont nous l'implémentons consiste à obtenir la liste des ID d'entité, à récupérer les ID en boucle, à récupérer le modèle d'entité par ID et à l'ajouter à la liste.
Pseudo code:
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)
});
Cela fonctionne, mais du point de vue des performances est très lent car il doit appeler contentProvider.getEntityModel(...)pour chaque ID.
Y a-t-il une meilleure solution pour cela? Peut-être une API de DXA qui génère une liste d'EntityModel?
Réponses
Velmurugan Nov 03 2020 at 06:06
Utilisez cette API CIL ci-dessous pour récupérer plusieurs contenus DCP par un seul exemple d'appel fourni ci-dessous est basé sur une API similaire .NET également disponible en java.
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();
J'espère que cela aide.