2017-10-18 3 views
3

Vaadin Blog 문서를 기반으로 지연 격자로드를 구현했으며 특정 격자 열에 필터를 추가하려고합니다. 이 경우 lambda 함수를 CallbackDataProvider로 설정하여 지연로드를 수행합니다. 아래 코드를 참조하십시오.Vaadin Grid - 지연로드가있는 다중 필터

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() { ... } 
} 

는 DataProvider를 설정 : 예에서

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

유형 Map<String, Object>의 격자를 사용. 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

관련 문제