从Vaadin Grid获取列表<项目>

时间:2018-07-12 09:43:34

标签: java vaadin vaadin8

问题:我有一个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()进行传递,但是没有有用的吸气剂。

我找不到任何吸气剂,我怎么能做到这一点?谢谢

3 个答案:

答案 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接口中实现的原因。

相关问题