Cara yang efisien untuk mendapatkan daftar EntityModel (Java, DXA 2.0)

Oct 28 2020

Kami memiliki halaman yang menanyakan entitas dengan kriteria tertentu.

Cara kita mengimplementasikannya adalah dengan mendapatkan daftar ID entitas, loop ID mengambil model entitas per ID dan menambahkannya ke dalam daftar.

Kode semu:

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)
});

Ini berfungsi, namun dari sudut pandang kinerja sangat lambat karena perlu memanggil contentProvider.getEntityModel(...)setiap ID.

Apakah ada solusi yang lebih baik untuk ini? Mungkin API dari DXA yang menghasilkan daftar EntityModel?

Jawaban

Velmurugan Nov 03 2020 at 06:06

Gunakan ini di bawah CIL API untuk mengambil beberapa konten DCP dengan satu contoh panggilan yang diberikan di bawah ini didasarkan pada API serupa .NET juga tersedia di 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();

Saya harap ini membantu.