答案是否定的,否则没有多大意义。该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();
}
从评论中回答您的问题:是的,ListDataProvider
按照您在其源代码中看到的排序。对于您的 SQL 数据库:是的,这是首选方式。