从 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 接口中的原因。
问题:我有一个 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 接口中的原因。