从 Vaadin 8 网格获取列表 <items>

Get List<items> from Vaadin 8 Grid

问题:我有一个 Vaadin 8 Grid ,但我找不到提取其中项目的方法。

描述: 从网格开始

Grid<Pojo> myGrid = new Grid<>();

我已将其配置为可以通过延迟加载获取数据。

    myGrid.setDataProvider(
            (sortOrd, offset, limit) -> dao.getAllFiltered(offset, limit, filter),
            () -> dao.getCountAllFiltered(filter)
    );

此时,我想从网格中提取所有项目(以便将其放入 excel),例如 List<Pojo> list = myGrid.getItems();。我也试过通过 myGrid.getDataProvider() ,但是 getter 没有用。

我找不到任何 getter,我该如何实现?谢谢

你基本上试过了吗?

List<Pojo> list = grid.getDataProvider()
                      .fetch(new Query<>())
                      .collect(Collectors.toList());

TL;DR:你不能。网格利用数据提供者获取要显示的数据块(因此 count/limit/offset)。事实上,有急切的数据源后端(直接设置项目)只是为了让带有急切数据的网格更容易。

所以这里的解决方案是从您的实际来源(您的存储库等)中提取数据。所以在你的情况下是这样的:

dao.getAllFiltered(0, dao.getCountAllFiltered(filter), filter)

或者无论如何,这会让事情变得更简单。

所有DataProvider的实现上面提到的fetch(..)方法。 IE。这个答案是普遍的。

还有其他方法,你也可以:

List<Pojo> list = 
grid.getDataCommunicator.fetchItemsWithRange(0,grid.getDataCommunicator.getDataProviderSize());

另请参阅:

与上面提到的 fetch(..) 方法的不同之处在于 DataCommunicator.fetchItemsWithRange 将以当前在 Grid 中排序和过滤的方式给出项目。

如果 DataProvider 是 ListDataProvider 的实例,则以下也是可能的并推荐

ListDataProvider dataProvider = (ListDataProvider) grid.getDataProvider();
List<Pojo> list = dataProvider.getItems();

所以这个问题至少有三个正确答案。哪个最合适取决于应用。

提醒一下,使用 fetch(..) 或 fetchItemsWithRange(..) 从延迟加载数据提供者获取所有项目,可能会导致巨大且耗费内存的数据库查询(即获取全部内容)。你可能不应该那样做。这就是为什么 getItems() 仅在 ListDataProvider 中实现,而不包含在通用 DataProvider 接口中的原因。