【问题标题】:Vaadin Grid - Multiple filters with Lazy loadingVaadin Grid - 具有延迟加载的多个过滤器
【发布时间】:2018-03-30 17:08:30
【问题描述】:

我们已经根据Vaadin Blog 文章实现了延迟 Grid 加载,并希望为某些 Grid 列添加过滤器。在这种情况下,我们通过将 lambda 函数设置为 CallbackDataProvider 来进行延迟加载。请看下面的代码。

我们如何将 CallbackDataProvider 与过滤结合起来?根据StackOverflow post,作者可以通过使用 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() { ... }
}

设置数据提供者:

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()
);

【问题讨论】:

    标签: filter grid vaadin loading lazy-evaluation


    【解决方案1】:

    在示例中使用Map&lt;String, Object&gt; 类型的网格。跳过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;
        }
    

    设置数据提供者并添加过滤器:

    ConfigurableFilterDataProvider<Map<String, Object>, Void, MyFilter> dataProvider = getFilteredDataProvider("myTable");
    dataProvider.setFilter(myFilter);
    grid.setDataProvider(dataProvider);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2011-12-20
    • 2020-05-27
    • 2017-10-07
    • 2021-10-26
    • 1970-01-01
    • 2011-02-22
    相关资源
    最近更新 更多