Filter Vaadin网格-具有延迟加载的多个过滤器
我们已经基于本文实现了延迟网格加载,并希望为某些网格列添加过滤器。在本例中,我们通过将lambda函数设置为CallbackDataProvider来执行延迟加载。请参阅下面的代码 我们如何将CallbackDataProvider与筛选结合起来?据此,作者可以通过使用ConfigurableFilterDataProvider作为CallbackDataProvider的包装器来解决这个问题。遗憾的是,他没有分享更多的代码。 你能给我们一些提示吗 我们的代码完全基于博客文章,如下所示:Filter Vaadin网格-具有延迟加载的多个过滤器,filter,grid,vaadin,loading,lazy-evaluation,Filter,Grid,Vaadin,Loading,Lazy Evaluation,我们已经基于本文实现了延迟网格加载,并希望为某些网格列添加过滤器。在本例中,我们通过将lambda函数设置为CallbackDataProvider来执行延迟加载。请参阅下面的代码 我们如何将CallbackDataProvider与筛选结合起来?据此,作者可以通过使用ConfigurableFilterDataProvider作为CallbackDataProvider的包装器来解决这个问题。遗憾的是,他没有分享更多的代码。 你能给我们一些提示吗 我们的代码完全基于博客文章,如下所示: pub
public class Person {
private Long id;
private String firstName;
private String lastName;
private String email;
... getter and setters ...
}
public class PersonService {
public List<Person> findAll(int offset, int limit) { ... }
public int count() { ... }
}
公共类人物{
私人长id;
私有字符串名;
私有字符串lastName;
私人字符串电子邮件;
…能手和二传手。。。
}
公共类人员服务{
公共列表findAll(整数偏移量,整数限制){…}
公共整数计数(){…}
}
设置数据提供程序:
grid.setDataProvider(
(sortOrders, offset, limit) -> {
Map<String, Boolean> sortOrder = sortOrders.stream().collect(
Collectors.toMap(
sort -> sort.getSorted(),
sort -> SortDirection.ASCENDING.equals(sort.getDirection())
)
);
return service.findAll(offset, limit, sortOrder).stream();
},
() -> service.count()
);
grid.setDataProvider(
(排序、偏移、限制)->{
Map sortOrder=sortOrders.stream().collect(
汤姆(
sort->sort.getSorted(),
sort->SortDirection.ASCENDING.equals(sort.getDirection())
)
);
return service.findAll(offset,limit,sortOrder).stream();
},
()->service.count()
);
在示例中,使用类型为Map
的网格。跳过了getCount()
实现
public ConfigurableFilterDataProvider<Map<String, Object>, Void, MyFilter> getFilteredDataProvider(String table)
{
DataProvider<Map<String, Object>, MyFilter> dataProvider = DataProvider.fromFilteringCallbacks( query -> {
List<Map<String, Object>> list = fetchFilteredItems(table, query.getOffset(), query.getLimit(), query.getFilter());
return list.stream();
}, query -> getCount(table, query.getFilter()) );
return dataProvider.withConfigurableFilter();
}
private List<Map<String, Object>> fetchFilteredItems(String table, int offset, int limit, Optional<MyFilter> filter)
{
long tStart = System.currentTimeMillis();
String sql;
if (filter.isPresent() && !filter.get().getSql(true).isEmpty())
{
sql = "SELECT * FROM ( "
+ "SELECT * FROM("
+ "SELECT rownum rn, t.* FROM " + table + " t "
+ filter.get().getSql() + ") "
+ "WHERE rownum <= " + (limit+offset) + ") "
+ "WHERE rn > " + offset;
}
else
{
sql = "SELECT * FROM ("
+ "SELECT rownum rn, t.* FROM " + table + " t"
+ " WHERE rownum <= " + (limit+offset) + ") WHERE rn > " + offset;
}
List<Map<String, Object>> result = jdbcTemplate.queryForList( sql, new Object[]{});
return result;
}
public ConfigurableFilterDataProvider getFilteredDataProvider(字符串表)
{
DataProvider DataProvider=DataProvider.fromFilteringCallbacks(查询->{
List List=fetchFilteredItems(表,query.getOffset(),query.getLimit(),query.getFilter());
返回list.stream();
},query->getCount(表,query.getFilter());
返回dataProvider.withConfigurableFilter();
}
私有列表fetchFilteredItems(字符串表、整数偏移量、整数限制、可选筛选器)
{
long tStart=System.currentTimeMillis();
字符串sql;
if(filter.isPresent()&&!filter.get().getSql(true.isEmpty())
{
sql=“选择*自(”
+“从(”
+从“+表+”t中选择rownum rn,t.*”
+filter.get().getSql()+“””
+“其中rownum”+偏移量;
}
其他的
{
sql=“选择*自(”
+从“+表+”t中选择rownum rn,t.*”
+“其中rownum”+偏移量;
}
List result=jdbcTemplate.queryForList(sql,新对象[]{});
返回结果;
}
设置数据提供程序并添加筛选器:
ConfigurableFilterDataProvider<Map<String, Object>, Void, MyFilter> dataProvider = getFilteredDataProvider("myTable");
dataProvider.setFilter(myFilter);
grid.setDataProvider(dataProvider);
ConfigurableFilterDataProvider dataProvider=getFilteredDataProvider(“myTable”);
dataProvider.setFilter(myFilter);
grid.setDataProvider(数据提供者);
谢谢。我与您的帖子结合解决了这个问题。我的代码来自泛型系统,我不想将其简化为DAO,所以可能有人会发现它更有用:)