Hi,
We have a small example that demonstrates how to fetch data in batches when TreeDataGrid requires it. You can find the project on GitHub.
The project contains an example of implementing lazy data loading for TreeDataGrid.
-
Task - hierarchy entity
-
LazyTreeDataGrid - replaces standard TreeDataGrid and creates specific vaadin DataProvider instance in case LazyTreeDataGridItems is passed. It registered in LazyTreeComponentApplication using ComponentRegistration.
-
LazyHierarchicalDataGridDataProvider - Vaadin DataProvider implementation that works with LazyTreeDataGridItems.
-
TaskBrowse.TaskLazyTreeDataGridItems - sample implementation of LazyTreeDataGridItems. It uses DataManager to fetch data every time TreeDataGrid requestes it. Query parameters are obtained from Vaadin HierarchicalQuery object.
Below implementation of the fetchChildren method:
@Override
public Stream<Task> fetchChildren(HierarchicalQuery<Task, SerializablePredicate<Task>> query) {
List<Task> list = dataManager.load(Task.class)
.query("select e from demo_Task e where e.parent = :parent")
.parameter("parent", query.getParent())
.sort(sort)
.firstResult(query.getOffset())
.maxResults(query.getLimit())
.list();
log.info("Loaded: {} items", list.size());
return list.stream();
}
Keep in mind that this implementation is just an example and requires polishing. For example, some cache is needed, because Vaadin in some conditions calls this method twice with the same arguments.
Regards,
Gleb