Vaadin:过滤器菊花链?

Jof*_*off 3 java vaadin vaadin-grid vaadin10

我现在有这个特殊问题 - 我有一个网格,我试图通过多个过滤器过滤数据。为此,我使用文本框作为过滤条件的输入字段。

我的网格有三列(名字、姓氏、地址),我希望能够一个接一个地链接过滤操作。所有值均取自 MySQL 数据库。

本质上,过滤过程应该是这样的:

FirstName ^ LastName ^ Address
Run Code Online (Sandbox Code Playgroud)

例如,具有三列的网格:

在此处输入图片说明

桌子

在 First Name 列的过滤器中,我输入了 variables Aa,这将导致表如下所示:

在此处输入图片说明

表格1

但是,如果我决定输入D姓氏过滤器,它会返回如下结果(忽略第一个过滤器的修改):

在此处输入图片说明

表3

而不是看起来像这样的预期结果:

在此处输入图片说明 在此处输入图片说明

我通过网格过滤的方式是这样的:

firstNameFilter.addValueChangeListener( e->
    {
        Notification.show(e.getValue());

        ldp.setFilter(desc -> 
        {
            return StringUtils.containsIgnoreCase(desc.getFName(), firstNameFilter.getValue());
        });
    });     
    firstNameFilter.setValueChangeMode(ValueChangeMode.EAGER);
Run Code Online (Sandbox Code Playgroud)

考虑到以前的过滤操作,过滤多列的最佳方法是什么?

Kas*_*rer 8

listDataProvider.setFilter(...)将覆盖任何现有的过滤器。
我已经写了一个关于这个主题的答案,有一个完整的示例代码可供复制粘贴,以及显示多个过滤器按预期工作的屏幕截图。
其中最重要的一点是:

每次任何过滤器值更改时,我都会使用 setFilter 重置当前过滤器。但是在那个新过滤器中,我将检查所有过滤器字段的值,而不仅仅是值刚刚更改的字段的值。换句话说,我总是只有一个过滤器处于活动状态,但该过滤器考虑了所有定义的过滤器值。


以下是您的代码的外观:

firstNameFilter.addValueChangeListener( e-> this.onFilterChange());
lastNameFilter.addValueChangeListener( e-> this.onFilterChange());
addressFilter.addValueChangeListener( e-> this.onFilterChange());
// sidenote: all filter fields need ValueChangeMode.EAGER to work this way


private void onFilterChange(){
    ldp.setFilter(desc -> {
        boolean fNameMatch = true;
        boolean lNameMatch = true;
        boolean addressMatch = true;

        if(!firstNameFilter.isEmpty()){
            fNameMatch = StringUtils.containsIgnoreCase(desc.getFName(), firstNameFilter.getValue());
        }
        if(!lastNameFilter.isEmpty()){
            lNameMatch = StringUtils.containsIgnoreCase(desc.getLName(), lastNameFilter.getValue());
        }
        if(!addressFilter.isEmpty()){
            addressMatch = StringUtils.containsIgnoreCase(desc.getAddress(), addressFilter.getValue());
        }

        return fNameMatch && lNameMatch && addressMatch;
    });
});     
Run Code Online (Sandbox Code Playgroud)