Vaadin 网格 - 使用延迟加载进行过滤
Vaadin grid - filtering with lazy loading
我有 vaadin 网格,它具有从框中延迟加载数据的功能,这很棒。但由于某些原因,我有自定义过滤器,我通过
使用
CallbackDataProvider<> dataProvider.fetch(Query query)
查询对象具有按部分加载的参数(offset
和 limit
),因此我需要动态设置它 (?) 并以某种方式监听用户向下滚动时加载下一部分数据的网格滚动事件 (?)
Grid.dataComunicator
有字段 Range pushRows
但没有 public 方法来获取它。我所拥有的只是带有延迟加载但没有过滤数据的网格或带有过滤数据的急切加载的网格。
那么,有没有什么办法可以在vaadin grid element中实现延迟加载过滤数据呢?
好的,通过使用 ConfigurableFilterDataProvider<>
作为 CallbackDataProvider<>
的包装解决了问题。
所以,当我过滤 table 时,这个包装器将过滤条件添加到所有查询,并且数据加载像往常一样延迟。
我是使用 vaadin 22 到达这里的。答案可能与问题的上下文不同,但考虑到我是到达这里的,我怀疑其他人也会。
要创建一个使用延迟加载并能够将过滤器注入查询的网格,请使用:
class SearchableGrid<E> {
Grid<E> entityGrid = new Grid<>();
private SearchableGrid(DaoDataProvider daoProvider)
{
var view = entityGrid.setItems(query ->
{
// add the filter to the query
var q = new Query<E, String>(query.getOffset(), query.getLimit(), query.getSortOrders(), null,
getSearchField().getValue());
return daoProvider.fetchFromBackEnd(q);
});
view.setItemCountCallback(query ->
{
// add the filter to the query
var q = new Query<E, String>(query.getOffset(), query.getLimit(), query.getSortOrders(), null,
getSearchField().getValue());
return daoProvider.sizeInBackEnd(q);
});
}
我已经将这些方法打包到一个 BackEndDataProvider 中 class
可用作组合框的提供程序。
public class DaoDataProvider<E extends CrudEntity>
extends AbstractBackEndDataProvider<E, String>
{
JpaBaseDao<E> dao;
GetFilterBuilder<E> getFilterBuilder;
public DaoDataProvider(JpaBaseDao<E> daoProvider, GetFilterBuilder<E> getFilterBuilder)
{
this.dao = daoProvider;
this.getFilterBuilder = getFilterBuilder;
}
@Override
public int sizeInBackEnd(Query<E, String> query)
{
var q = getFilterBuilder.builderFilter(query);
return (int) q.count().intValue();
}
@Override
public Stream<E> fetchFromBackEnd(Query<E, String> query)
{
var q = getFilterBuilder.builderFilter(query);
q.startPosition(query.getOffset()).limit(query.getLimit());
return q.getResultList().stream();
}
}
filterBuilder 是您为后端数据提供程序构建查询的地方。
我有 vaadin 网格,它具有从框中延迟加载数据的功能,这很棒。但由于某些原因,我有自定义过滤器,我通过
使用CallbackDataProvider<> dataProvider.fetch(Query query)
查询对象具有按部分加载的参数(offset
和 limit
),因此我需要动态设置它 (?) 并以某种方式监听用户向下滚动时加载下一部分数据的网格滚动事件 (?)
Grid.dataComunicator
有字段 Range pushRows
但没有 public 方法来获取它。我所拥有的只是带有延迟加载但没有过滤数据的网格或带有过滤数据的急切加载的网格。
那么,有没有什么办法可以在vaadin grid element中实现延迟加载过滤数据呢?
好的,通过使用 ConfigurableFilterDataProvider<>
作为 CallbackDataProvider<>
的包装解决了问题。
所以,当我过滤 table 时,这个包装器将过滤条件添加到所有查询,并且数据加载像往常一样延迟。
我是使用 vaadin 22 到达这里的。答案可能与问题的上下文不同,但考虑到我是到达这里的,我怀疑其他人也会。
要创建一个使用延迟加载并能够将过滤器注入查询的网格,请使用:
class SearchableGrid<E> {
Grid<E> entityGrid = new Grid<>();
private SearchableGrid(DaoDataProvider daoProvider)
{
var view = entityGrid.setItems(query ->
{
// add the filter to the query
var q = new Query<E, String>(query.getOffset(), query.getLimit(), query.getSortOrders(), null,
getSearchField().getValue());
return daoProvider.fetchFromBackEnd(q);
});
view.setItemCountCallback(query ->
{
// add the filter to the query
var q = new Query<E, String>(query.getOffset(), query.getLimit(), query.getSortOrders(), null,
getSearchField().getValue());
return daoProvider.sizeInBackEnd(q);
});
}
我已经将这些方法打包到一个 BackEndDataProvider 中 class 可用作组合框的提供程序。
public class DaoDataProvider<E extends CrudEntity>
extends AbstractBackEndDataProvider<E, String>
{
JpaBaseDao<E> dao;
GetFilterBuilder<E> getFilterBuilder;
public DaoDataProvider(JpaBaseDao<E> daoProvider, GetFilterBuilder<E> getFilterBuilder)
{
this.dao = daoProvider;
this.getFilterBuilder = getFilterBuilder;
}
@Override
public int sizeInBackEnd(Query<E, String> query)
{
var q = getFilterBuilder.builderFilter(query);
return (int) q.count().intValue();
}
@Override
public Stream<E> fetchFromBackEnd(Query<E, String> query)
{
var q = getFilterBuilder.builderFilter(query);
q.startPosition(query.getOffset()).limit(query.getLimit());
return q.getResultList().stream();
}
}
filterBuilder 是您为后端数据提供程序构建查询的地方。