问题:我有一个Vaadin 8网格,我找不到提取其中项目的方法。
描述:从网格开始
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
我找不到任何激励者,我该如何做到这一点?感谢
你基本上试过这个吗?
List<Pojo> list = grid.getDataProvider()
.fetch(new Query<>())
.collect(Collectors.toList());
所有DataProvider的实现上面提到的fetch(..(方法。也就是说,这个答案是普遍的。
还有其他方法,你也可以做:
List<Pojo> list =
grid.getDataCommunicator.fetchItemsWithRange(0,grid.getDataCommunicator.getDataProviderSize());
另请参阅:在Vaadin 中调用FileDownloader时使用过滤后的dataProvider内容
与上述fetch(..(方法的不同之处在于,DataCommunicatior.fetchItemsWithRange将以当前在网格中排序和筛选的方式给出项目。
如果DataProvider是ListDataProvideer的实例,那么以下也是可能的,并推荐
ListDataProvider dataProvider = (ListDataProvider) grid.getDataProvider();
List<Pojo> list = dataProvider.getItems();
因此,这个问题至少有三个正确答案。哪个最合适取决于应用程序。
值得提醒的是,使用fetch(..(或fetchItemsWithRange(..(从懒惰加载的数据提供程序中获取所有项目,可能会导致巨大且消耗内存的数据库查询(即获取整个内容(。你可能不应该那样做。这就是为什么getItems((只在ListDataProvider中实现,而不包括在通用DataProvideer接口中。
TL;DR:你不能。网格利用数据提供程序来获取要显示的数据块(因此是计数/限制/偏移(。事实上,有迫切的数据源后端(直接设置项(只是为了让具有迫切数据的网格更容易。
因此,这里的解决方案是从实际来源(存储库等(中提取数据。所以在你的情况下,它是这样的:
dao.getAllFiltered(0, dao.getCountAllFiltered(filter), filter)
或者无论如何,这会让事情变得更简单。