Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Vaadin数据提供程序-在查询中使用bean作为参数使用后端进行排序 背景_Java_Vaadin_Vaadin8_Vaadin Grid - Fatal编程技术网

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

Java Vaadin数据提供程序-在查询中使用bean作为参数使用后端进行排序 背景,java,vaadin,vaadin8,vaadin-grid,Java,Vaadin,Vaadin8,Vaadin Grid,我试图允许Vaadin网格中的数据可以排序。使用REST调用从后端检索数据。bean类型如下所示: 公共类事件{ 私有类型; 私有LocalDateTime最新版本; //…接球手、二传手等。 } 公共类类型{ 私有字符串名称; 私有字符串调用码; //…接球手、二传手等。 } 我们正在使用FilterablePageDataProvider()从后端加载数据。重要的方法是: dataProvider=newfilterablepageabledataprovider{ @凌驾 受保护的流f

我试图允许Vaadin网格中的数据可以排序。使用REST调用从后端检索数据。bean类型如下所示:

公共类事件{
私有类型;
私有LocalDateTime最新版本;
//…接球手、二传手等。
}
公共类类型{
私有字符串名称;
私有字符串调用码;
//…接球手、二传手等。
}
我们正在使用FilterablePageDataProvider()从后端加载数据。重要的方法是:

dataProvider=newfilterablepageabledataprovider{
@凌驾
受保护的流fetchFromBackEnd(查询){
返回typeService.fetchFromBackEnd(查询);
}
@凌驾
受保护的int sizeInBackEnd(查询){
返回typeService.sizeInBackEnd(查询);
}
@凌驾
受保护列表getDefaultSortOrders(){
返回Sort.asc(“name”).build();
}
};
包含以下代码以将其放置在
网格
的列中可以正常工作,排序也没有问题:

grid.addColumn(type->type.getName()).setSortProperty(“name”);
grid.addColumn(type->type.getCallCode()).setSortProperty(“callCode”);
问题 让我感到困惑的是,当在查询中使用网格项作为参数时,如何进行列排序,例如:

grid.addColumn(type->eventService.countByType(type));
使用
setSortProperty(String…properties)
不再有效,使用比较器是不可能的,因为内存排序中有太多的数据

如何使此查询在网格中可排序

  • 定义一个类EventFilter,该类具有各种属性以及getter/setter,您需要根据这些属性对记录进行筛选

  • 将此EventFilter的实例传递给DataProvider实例

  • DataProvider实例使用EventFilter实例的属性来获取所需的记录。DataProvider实例已被删除 从查询对象提取“sort”属性并获取记录的逻辑 因此。请参阅下面的代码

  • 公共类EventDataProvider扩展了AbstractBackEndDataProvider{
    私有静态最终长serialVersionUID=1L;
    private final ArrayList messages=new ArrayList();
    私有最终逻辑=新逻辑();
    专用最终事件过滤器;
    公共EventDataProvider(EventFilter筛选器){
    this.filter=过滤器;
    }
    @凌驾
    从后端获取受保护的流(查询){
    //TODO自动生成的方法存根
    SortingInfo SortingInfo=null;
    if(query.getSortOrders()!=null&!query.getSortOrders().isEmpty()){
    QuerySortOrder sortOrder=query.getSortOrders().get(query.getSortOrders().size()-1);
    sortingInfo=newsortinginfo(sortOrder.getSorted(),sortOrder.getDirection());
    }否则{
    sortingInfo=新的sortingInfo(“日期”,SortDirection.DESCENDING);
    }
    返回logic.getEvents(消息、筛选器、query.getLimit()、query.getOffset()、sortingInfo).stream();
    }
    @凌驾
    受保护的int sizeInBackEnd(查询){
    //TODO自动生成的方法存根
    返回逻辑.getEventScont(消息、过滤器);
    }
    @凌驾
    公共对象getId(事件项){
    //TODO自动生成的方法存根
    返回item.getDate()+“-”+item.getSlotId()+“-”+item.getLocationId();
    }
    }
    
    投影非常适合解决此问题。看见我正在处理一个类似的问题,但是我需要另外按startDate和endDate过滤eventService调用。我正在研究如何将其添加到投影中。
    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();
        }
    }