You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vaadin 8 Grid多过滤失效:设置双条件过滤后无数据显示

问题分析与解决方案

你这段代码的核心问题在于Predicate是不可变对象:调用and()方法并不会修改原来的filter实例,而是返回一个全新的、组合了两个条件的Predicate。但你现在的写法里,只是调用了and()却没有把返回的新对象赋值给filter变量,最终传给dataProvider.setFilter()的还是那个一开始就返回false的原始Predicate——这就导致所有数据都被过滤掉了,Grid自然显示为空。

修正方案一:正确赋值组合后的Predicate

把每次and()返回的新Predicate重新赋值给filter,确保最终使用的是组合了所有条件的过滤规则:

ListDataProvider<Person> dataProvider = (ListDataProvider<Person>) grid.getDataProvider();
// 先初始化第一个条件
SerializablePredicate<Person> filter = Person -> Person.getAge() == 30;
// 组合第二个条件,必须把返回值赋值回去
filter = filter.and(Person -> Person.getName().equalsIgnoreCase("bernd"));
dataProvider.setFilter(filter);

修正方案二:更简洁的链式写法

如果不需要后续动态添加条件,可以直接把两个条件用&&组合,一步到位:

ListDataProvider<Person> dataProvider = (ListDataProvider<Person>) grid.getDataProvider();
dataProvider.setFilter(Person -> Person.getAge() == 30 
    && Person.getName().equalsIgnoreCase("bernd"));

补充:动态添加多个条件的注意点

如果之后需要动态追加更多过滤规则,记住每次调用and()/or()后都要更新filter变量的引用:

SerializablePredicate<Person> filter = Person -> Person.getAge() == 30;
// 添加姓名过滤条件
filter = filter.and(Person -> Person.getName().equalsIgnoreCase("bernd"));
// 再追加城市过滤条件
filter = filter.and(Person -> Person.getCity().equals("Hamburg"));
dataProvider.setFilter(filter);

内容的提问来源于stack exchange,提问作者FarFarAway

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:02:34