是否可以在嵌套的对象列表中查询(即)让我们考虑以下示例,
class A implements Serializable{
public int id;
public List<B> incomingBs;
public A(int x){ this.id=x; }
}
class B implements Serializable{
public int id;
public List<A> outgoingAs;
public B(int x){ this.id=x; }
}
我开始知道如果另一个对象中有一个对象,我们可以使用以下查询在hazel cast sql谓词中查询,
System.out.println(map.values(new SqlPredicate("something > 0 and complexMember.someString like 'val%'")));
但是如果A类有B类列表,那么如何使用sql谓词在列表内查询?
或者以任何其他方式实现此用例。
谢谢和问候, 哈利
答案 0 :(得分:3)
我使用了谓谓谓词,它可以在任何类中实现,并在其中编写自己的逻辑。
查看我的代码,
public class ListPredicate implements Predicate<String,Object>{
private Set<String> switchIds = null;
public ListPredicate(Set<String> switchIds) {
this.switchIds = switchIds;
}
@Override
public boolean apply(Entry<String, Object> mapEntry) {
Container container = (Container) mapEntry.getValue();
for(String switchId : container.getFrameSwitchIdList()) {
if(switchIds.contains(switchId)) {
return true;
}
}
return false;
}
}
使用您自己的谓词作为查询,
Collection<Container> containerList = containerMap.values(new ListPredicate(switchIds));
答案 1 :(得分:1)
据我所知,SqlPredicate内部不支持收集/映射访问。但是你可以调用一个无法方法。因此,如果你可以将你的逻辑添加到方法中,你可以说afoobar foobar就是你的方法。
示例:
public class Main {
public static void main(String[] args){
HazelcastInstance hz = Hazelcast.newHazelcastInstance();
IMap<String,Person> persons = hz.getMap("persons");
persons.put("old", new Person(30));
persons.put("young", new Person(20));
Collection<Person> result = persons.values(new SqlPredicate("theAge>20"));
System.out.println(result.size());
}
public static final class Person implements Serializable{
int age;
public Person(int age){
this.age = age;
}
public int theAge(){
return age;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
'}';
}
}
}