gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:41:55 27 4
gpt4 key购买 nike

背景

我正在尝试允许 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com