代码之家  ›  专栏  ›  技术社区  ›  Leviand

从Vaadin网格获取列表<items>

  •  2
  • Leviand  · 技术社区  · 6 年前

    问题: 我有一个Vaadin8网格,我找不到一个方法来提取里面的项目。

    说明: 从网格开始

    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 回复  |  直到 6 年前
        1
  •  7
  •   Leviand    6 年前

    你基本上试过了吗?

    List<Pojo> list = grid.getDataProvider()
                          .fetch(new Query<>())
                          .collect(Collectors.toList());
    
        2
  •  1
  •   cfrick    6 年前

    tl;dr:不能。网格使用数据提供程序获取要显示的数据块(因此是计数/限制/偏移)。事实上,存在渴望的数据源后端(直接设置项目),这只是为了让拥有渴望数据的网格更容易。

    所以这里的解决方案就是从实际的源(存储库等)中提取数据。所以在你的例子中是这样的:

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

    或者通过任何方式,使之简单化。

        3
  •  1
  •   Tatu Lund    6 年前

    所有数据提供程序的实现上面提到的fetch(..)方法。也就是说,这个答案是普遍的。

    还有其他方法,您也可以这样做:

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

    另请参见: Use filtered dataProvider contents when FileDownloader is called in Vaadin

    与上面提到的fetch(..)方法不同的是,datacommunicator.fetchitemswithrange将以网格中当前排序和筛选的方式提供项目。

    如果dataprovider是listdataprovider的实例,则可以并推荐以下内容

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

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

    值得提醒的是,使用fetch(..)或fetchitemswithrange(..)从延迟加载的数据提供程序获取所有项可能会导致巨大的、占用内存的数据库查询(即获取整个内容)。你可能不应该这样做。这就是为什么getitems()只在ListDataProvider中实现,而不包含在通用DataProvider接口中的原因。