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