Effiziente Methode zum Abrufen einer Liste von EntityModel (Java, DXA 2.0)
Wir haben eine Seite, die Entitäten mit bestimmten Kriterien abfragt.
Die Art und Weise, wie wir es implementieren, besteht darin, eine Liste der Entitäts-IDs abzurufen, die IDs zu schleifen, das Entitätsmodell pro ID abzurufen und es der Liste hinzuzufügen.
Pseudocode:
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)
});
Dies funktioniert jedoch aus Sicht der Leistung sehr langsam, da contentProvider.getEntityModel(...)jede ID abgerufen werden muss.
Gibt es dafür eine bessere Lösung? Vielleicht eine API von DXA, die eine Liste von EntityModel generiert?
Antworten
Verwenden Sie diese unten stehende CIL-API, um mehrere DCP-Inhalte mit einem einzigen Aufruf abzurufen. Das unten angegebene Beispiel basiert auf einer ähnlichen .NET-API, die auch in Java verfügbar ist.
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();
Ich hoffe, es hilft.