Vaadin Tip: Lazy Loading and Item Identity

When using grids, trees or any other of multi-valued component with Vaadin you often want to display data from a

blog-post-img

When using grids, trees or any other of multi-valued component with Vaadin you often want to display data from a database table and typically you have more than a few rows in the database.

When using grids, trees or any other of multi-valued component with Vaadin you often want to display data from a database table and typically you have more than a few rows in the database.
In this case loading thousands or even millions of records don’t make sense and would be a huge performance problem.
For this use case Vaadin provides lazy loading using a CallbackDataProvider.

To create a CallBackDataProvider you must implement a CountCallback and a FetchCallback.
The CountCallback is used to provide the total number of records. And the FetchCallback is used for paging. Both methods receive a Query object that contains filter, sorting, offset and limit.

In this example you can see how to use offset and limit.


DataProvider<Employee, Void> dataProvider = new CallbackDataProvider<>(
                query -> employeeRepository.findAll(query.getOffset(), query.getLimit()),
                query -> employeeRepository.count()
        );
    

Item Identity

In a Grid or the DataProvider there are methods that are using an item:


grid.select(employee);
dataProvider.refreshItem(employee);
    

Ever wondered how Vaadin is finding the right item in the underlying data structure? No surprise – it uses equals().
But what if you can’t control how equals() is implemented? For example if the Class that you use in the Grid is generated directly from the database tables like jOOQ does?

No worries! Vaadin provides another constructor to create a CallbackDataProvivder

As a third parameter you pass a ValueProvider that is responsible to return a unique identifier. In the example this is the ID of the Employee.


DataProvider<Employee, Void> dataProvider = new CallbackDataProvider<>(
                query -> employeeRepository.findAll(query.getOffset(), query.getLimit()),
                query -> employeeRepository.count(),
                Employee::getId
        );
    

What’s next?

Our Vaadin courses are a great way to extend your knowledge of Vaadin. We offer basic and advances courses for different levels of knowledge.

Programming Architect at 72® Services
Simon Martinelli ist ein versierter Experte für Java, Leistungsoptimierung, Anwendungsintegration, Softwarearchitektur und Systemdesign mit 27 Jahren Erfahrung als Entwickler, Architekt und technischer Projektmanager. Kontaktieren Sie mich hier oder buchen Sie einen Beratungstermin über Calendly.
Latest posts by Simon Martinelli (see all)
Simon Martinelli
Programming Architect 72® Services
Simon Martinelli is an accomplished expert in Java, performance optimization, application integration, software architecture and system design with 27 years of experience as a developer, architect and technical project manager. Contact me here or book a consulting appointment via Calendly.