使用字段Object []数组Ignite Cache SQL查询

时间:2018-03-17 20:08:39

标签: java sql ignite

我有一个Ignite缓存,下面有两个类。

MyPerson类看起来像这样:

public class MyPerson implements Serializable
{
    @QuerySqlField()
    public String ID;

    @QuerySqlField()
    public Socials[] socials;
}

Socials课程看起来像这样:

public class Socials implements Serializable
{
    @QuerySqlField()
    public String network;

    @QuerySqlField()
    public String login;
}

我像这样创建和填充缓存:

// creating person cache
CacheConfiguration<String, MyPerson> personCacheCfg = new CacheConfiguration<String, MyPerson>();
personCacheCfg.setName("Person");
personCacheCfg.setIndexedTypes(String.class, MyPerson.class);
IgniteCache<String, MyPerson> personCache = ignite.createCache(personCacheCfg);

// adding data
personCache.put("P1", new MyPerson("Person1", new Socials[] { new Socials("fb", "a@my.com"), new Socials("tw", "b.my.com") }));
personCache.put("P2", new MyPerson("Person2", new Socials[] { new Socials("tw", "c.my.com") }));
personCache.put("P3", new MyPerson("Person3", new Socials[] { new Socials("fb", "d.my.com") }));

现在,当我想运行一个返回具有特定Socials帐户的所有人的SqlFieldQuery时,我将如何使用Ignite SQL执行此操作?这会是数组字段的连接吗?或者通过将Socials存储在单独的缓存中来更好地完成这种情况?

1 个答案:

答案 0 :(得分:2)

您无法通过嵌套集合或数组运行SQL查询。您应该创建另一个对personId表并在这两个表上运行连接。

确保ScanQuery并列这些表的数据。否则,您将需要分布式连接,这会显着影响性能。您可以在此处找到关于亲缘关系配置的文档:https://apacheignite.readme.io/docs/affinity-collocation

不使用SQL的另一个选项是using()。但它需要完整的数据查找。如果您要选择大部分数据,扫描查询也可能是一个不错的选择。文档:https://apacheignite.readme.io/docs/cache-queries#scan-queries