如何用Hazelcast Predicate查询含name=ABC且brands为空的Wheel的Motorbike?
可以通过Hazelcast Predicate实现需求
完全可以实现你的查询需求,Hazelcast的Predicate API支持对嵌套List类型的属性进行条件过滤,以下是具体实现思路和代码示例:
核心实现思路
你需要检索的是包含至少一个满足name="ABC"且brands为空列表的Wheel的Motorbike,核心是用Predicates.exists()检查集合中是否存在符合条件的元素,再组合两个子条件:
- 判断Wheel的
name等于"ABC":使用Predicates.equal("name", "ABC") - 判断Wheel的
brands为空列表:使用Predicates.isEmpty("brands")(也可以用Predicates.equal("brands.size()", 0),前者更直观)
完整代码示例
import com.hazelcast.query.Predicate; import com.hazelcast.query.Predicates; // 构建目标Predicate Predicate<Motorbike> motorbikePredicate = Predicates.exists("wheels", Predicates.and( Predicates.equal("name", "ABC"), Predicates.isEmpty("brands") ) ); // 使用该Predicate查询Map Map<String, Motorbike> resultMap = yourHazelcastMap.values(motorbikePredicate);
关键细节说明
Predicates.exists("wheels", ...):该方法专门用于检查集合(List/Set等)中是否存在至少一个元素满足内部的Predicate条件,完全支持List类型,不需要局限于数组。- 如果你需要的是所有Wheel都满足该条件的Motorbike,只需把
exists换成Predicates.all("wheels", ...)即可。 - 你提到的
wheels[0].name写法确实支持List,但它是取列表中指定索引的元素进行判断,适合固定位置的元素查询,而你的需求是检查任意元素,因此exists更匹配。
内容的提问来源于stack exchange,提问作者ham_ben
相关产品推荐
相关产品推荐

