在hazel cast中使用sql谓词的嵌套get / update函数

时间:2014-09-16 10:35:31

标签: java sql serialization hazelcast

是否可以在嵌套的对象列表中查询(即)让我们考虑以下示例,

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谓词在列表内查询?

或者以任何其他方式实现此用例。

谢谢和问候, 哈利

2 个答案:

答案 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 +
                '}';
    }
}
}