Filter Vaadin网格-具有延迟加载的多个过滤器

Filter Vaadin网格-具有延迟加载的多个过滤器,filter,grid,vaadin,loading,lazy-evaluation,Filter,Grid,Vaadin,Loading,Lazy Evaluation,我们已经基于本文实现了延迟网格加载,并希望为某些网格列添加过滤器。在本例中,我们通过将lambda函数设置为CallbackDataProvider来执行延迟加载。请参阅下面的代码 我们如何将CallbackDataProvider与筛选结合起来?据此,作者可以通过使用ConfigurableFilterDataProvider作为CallbackDataProvider的包装器来解决这个问题。遗憾的是,他没有分享更多的代码。 你能给我们一些提示吗 我们的代码完全基于博客文章,如下所示: pub

我们已经基于本文实现了延迟网格加载,并希望为某些网格列添加过滤器。在本例中,我们通过将lambda函数设置为CallbackDataProvider来执行延迟加载。请参阅下面的代码

我们如何将CallbackDataProvider与筛选结合起来?据此,作者可以通过使用ConfigurableFilterDataProvider作为CallbackDataProvider的包装器来解决这个问题。遗憾的是,他没有分享更多的代码。 你能给我们一些提示吗

我们的代码完全基于博客文章,如下所示:

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,所以可能有人会发现它更有用:)