java - Vaadin 数据提供程序 - 在查询中使用 bean 作为参数对后端进行排序

标签 java vaadin vaadin8 vaadin-grid

背景

我正在尝试允许 Vaadin 网格中的数据可排序。使用 REST 调用从后端检索数据。 bean 类型看起来像这样:

public class Event {

  private Type type;
  private LocalDateTime latest;

  //... getters, setters, etc.
}
public class Type {
  private String name;
  private String callCode;  

  //... getters, setters, etc. 
}

我们正在利用 FilterablePageableDataProvider ( source code ) 从后端加载数据。重要的方法有:

dataProvider = new FilterablePageableDataProvider<Type, Object> {
            @Override
            protected Stream<Type> fetchFromBackEnd(Query<Type, Object> query) {            
                return typeService.fetchFromBackEnd(query);
            }

            @Override
            protected int sizeInBackEnd(Query<Type, Object> query) {
                return typeService.sizeInBackEnd(query);
            }

            @Override
            protected List<QuerySortOrder> getDefaultSortOrders() {
                return Sort.asc("name").build();
            }
};

包括以下代码以将其放置在 Grid<Type> 中的专栏工作正常,排序没有问题:

grid.addColumn(type -> type.getName()).setSortProperty("name");
grid.addColumn(type -> type.getCallCode()).setSortProperty("callCode");

问题

让我感到不舒服的是试图弄清楚在使用网格项作为查询中的参数时如何进行列排序,例如:

grid.addColumn(type -> eventService.countByType(type));

使用setSortProperty(String ... properties)不再有效,并且使用比较器是不可能的,因为有太多数据需要进行内存排序。

如何使该查询在我的网格中可排序?

最佳答案

  1. Define a class EventFilter that has various attributes, alongwith getters/setters, that you need your records to be filtered on.

  2. Pass an instance of this EventFilter to the DataProvider instance.

  3. The DataProvider instance uses the attributes of the EventFilter instance to fetch the required records. The DataProvider instance has the logic to extract the "sort" property from Query object and fetch the records accordingly. See code below.

public class EventDataProvider extends AbstractBackEndDataProvider<Event, Void> {
    private static final long serialVersionUID = 1L;

    private final ArrayList<String> messages = new ArrayList<>();
    private final Logic logic = new Logic();
    private final EventFilter filter;

    public EventDataProvider(EventFilter filter) {
        this.filter = filter;
    }

    @Override
    protected Stream<Event> fetchFromBackEnd(Query<Event, Void> query) {
        // TODO Auto-generated method stub
        SortingInfo sortingInfo = null;
        if (query.getSortOrders() != null && !query.getSortOrders().isEmpty()) {
            QuerySortOrder sortOrder = query.getSortOrders().get(query.getSortOrders().size() - 1);
            sortingInfo = new SortingInfo(sortOrder.getSorted(), sortOrder.getDirection());
        } else {
            sortingInfo = new SortingInfo("date", SortDirection.DESCENDING);
        }
        return logic.getEvents(messages, filter, query.getLimit(), query.getOffset(), sortingInfo).stream();
    }

    @Override
    protected int sizeInBackEnd(Query<Event, Void> query) {
        // TODO Auto-generated method stub
        return logic.getEventsCount(messages, filter);
    }

    @Override
    public Object getId(Event item) {
        // TODO Auto-generated method stub
        return item.getDate() + "-" + item.getSlotId() + "-" + item.getLocationId();
    }
}

关于java - Vaadin 数据提供程序 - 在查询中使用 bean 作为参数对后端进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55484965/

相关文章:

java - 阻塞队列将等待元素出队多长时间?

java - 计算 Java 8 流中可能包含无效数字的映射值的总和

javascript - 瓦丁与 Ajax

java - 如何在 Vaadin 表中选择 headerClick 上的整列?

java - 如何在 Vaadin 8 中有条件地为网格行着色?

java - 在 Vaadin 8 中传递和接收数据

java - 数据绑定(bind)后组合框不可编辑

java - 如何通知 TreeModel 其底层模型已更改?

java - 简单的 Android 应用程序 - 在智能手机上运行时出现内存不足错误

java - Maven 中的 Vaadin 应用程序获取小部件错误(使用 tomcat)