使用DataProvider时,Vaadin 8网格排序不起作用

Shi*_*iri 4 sorting vaadin-grid vaadin8

在Vaadin 8中,排序网格行就像单击列标题一样简单.这将按照此处所述升序和降序排序之间切换列.这通过grid.setItems()方法填充Grid时有效.

但是,当使用a DataProvider作为Grid数据源时,单击列标题不会对行进行排序.

有一个关于描述排序顺序文件在这里DataProvider秒,但处理的排序顺序,当有多个排序要求.

有一个简单的办法简单地使用相同的默认排序行为,当与填充网格展示grid.setItems()了当我们与填充grid.setDataProvider()

Ste*_*ich 6

答案是否定的,否则就没有多大意义.该grid.setItems方法在内部创建一个ListDataProvider内存数据提供程序.因为它将所有数据保存在列表中,所以它可以使用比较器(来自网格列定义或提供给列表数据提供程序)轻松地对数据进行排序.因此,Vaadin只能在您将所有数据保存在内存中时帮助您进行排序.如果你有大量的行(例如一百万),这是低效的,因为你有很多内存和CPU消耗.这是您的自定义数据提供程序的用武之地.

想法DataProvider是将数据检索委托给像数据库这样的后端系统.例如,SQL数据库允许在SQL查询中指定"ORDER BY"子句,您可以使用该子句通过后端对数据进行排序.假设您已应用正确的索引,数据库本身在资源消耗方面非常有效.

那么你的实际数据来源是什么?也许您可以共享您迄今为止所做的数据提供者代码.

编辑

摘录自ListDataProvider:

@Override
public Stream<T> fetch(Query<T, SerializablePredicate<T>> query) {
    Stream<T> stream = getFilteredStream(query);

    Optional<Comparator<T>> comparing = Stream
            .of(query.getInMemorySorting(), sortOrder)
            .filter(c -> c != null)
            .reduce((c1, c2) -> c1.thenComparing(c2));

    if (comparing.isPresent()) {
        stream = stream.sorted(comparing.get());
    }

    return stream.skip(query.getOffset()).limit(query.getLimit());
}

@Override
public int size(Query<T, SerializablePredicate<T>> query) {
    return (int) getFilteredStream(query).count();
}
Run Code Online (Sandbox Code Playgroud)

要从评论中回答您的问题:是的,ListDataProvider您可以在其源代码中看到排序.使用您的SQL数据库:是的,这是首选方式.