我有一个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存储在单独的缓存中来更好地完成这种情况?
答案 0 :(得分:2)
您无法通过嵌套集合或数组运行SQL查询。您应该创建另一个对personId
表并在这两个表上运行连接。
确保ScanQuery
并列这些表的数据。否则,您将需要分布式连接,这会显着影响性能。您可以在此处找到关于亲缘关系配置的文档:https://apacheignite.readme.io/docs/affinity-collocation
不使用SQL的另一个选项是using()
。但它需要完整的数据查找。如果您要选择大部分数据,扫描查询也可能是一个不错的选择。文档:https://apacheignite.readme.io/docs/cache-queries#scan-queries