问题:我有一个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()
进行传递,但是没有有用的吸气剂。
我找不到任何吸气剂,我怎么能做到这一点?谢谢
答案 0 :(得分:7)
您基本上尝试过吗?
List<Pojo> list = grid.getDataProvider()
.fetch(new Query<>())
.collect(Collectors.toList());
答案 1 :(得分:1)
TL; DR:您不能。网格利用数据提供者获取要显示的数据块(因此计数/限制/偏移量)。拥有急切的数据源后端(直接设置项目)的事实仅仅是为了使带有急切数据的网格更容易。
因此,此处的解决方案是仅从实际来源(您的存储库等)中提取数据。所以在您的情况下是这样的:
dao.getAllFiltered(0, dao.getCountAllFiltered(filter), filter)
或者通过任何方式使事情变得简单。
答案 2 :(得分:1)
上述所有DataProvider的实现fetch(..)方法。即这个答案是普遍的。
还有其他方法,您也可以执行以下操作:
List<Pojo> list =
grid.getDataCommunicator.fetchItemsWithRange(0,grid.getDataCommunicator.getDataProviderSize());
另请参阅:Use filtered dataProvider contents when FileDownloader is called in Vaadin
与上述fetch(..)方法的不同之处在于,DataCommunicator.fetchItemsWithRange将按照当前在Grid中排序和过滤的方式提供项目。
如果DataProvider是ListDataProvider的实例,则可能并建议执行以下操作
ListDataProvider dataProvider = (ListDataProvider) grid.getDataProvider();
List<Pojo> list = dataProvider.getItems();
因此该问题至少有三个正确答案。哪个最合适取决于应用程序。
谨在此提醒您,使用fetch(..)或fetchItemsWithRange(..)从延迟加载数据提供程序获取所有项目,可能会导致数据库查询消耗大量内存(即获取整个内容) )。而且您可能不应该这样做。这就是为什么getItems()仅在ListDataProvider中实现,而未在通用DataProvider接口中实现的原因。