2017-10-18 12 views
3

Vaadin Blogの記事に基づいてレイジーグリッドローディングを実装し、特定のグリッドカラムにフィルタを追加したいとします。この場合、lambda関数をCallbackDataProviderとして設定することにより、遅延ロードを行います。以下のコードをご覧ください。Vaadinグリッド - レイジーローディングを使用する複数のフィルタ

CallbackDataProviderとフィルタリングをどのように組み合わせることができますか?このStackOverflow postによれば、著者は、CallbackDataProvider上のラッパーとしてConfigurableFilterDataProviderを使用することでこの問題を解決できます。残念ながら、彼はさらなるコードを共有していませんでした。 これを達成するためのヒントを教えてください。

私たちのコードが完全にブログの記事に基づいており、以下のようになっている。

データプロバイダの設定
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() { ... } 
} 

:タイプMap<String, Object>のグリッドを使用した例では

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

答えて

0

を。 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); 
+0

感謝。あなたの投稿の問題をhttps://vaadin.com/docs/v8/framework/datamodel/datamodel-providers.html#lazy-filteringと組み合わせて解決しました。 – Fabian

+0

私のコードは汎用システムから来ていて、私はDAOにそれを簡素化したくなかったので、多分誰かがもっと便利だと思うでしょう:) – avix

関連する問題