Ignite实战( 六 )

在上面的示例中 , @QuerySqlField(index = true)在类的所有字段以及Address类中的Address对象上都指定了注解Person 。
这使得执行如下 SQL 查询成为可能:
QueryCursor<List<?>> cursor = personCache.query(new SqlFieldsQuery( "select * from Person where street = 'street1'"));请注意,您不需要address.street在 SQL 查询的 WHERE 子句中指定 。这是因为Address类的字段在表中被展平,Person这仅允许我们直接访问Address查询中的字段 。
3.注册索引类型定义索引和可查询字段后,必须在 SQL 引擎中注册它们以及它们所属的对象类型 。
要指定应该索引哪些类型,请在方法中传递相应的键值对,CacheConfiguration.setIndexedTypes()如下例所示 。
// Preparing configuration.CacheConfiguration<Long, Person> ccfg = new CacheConfiguration<>();// Registering indexed type.ccfg.setIndexedTypes(Long.class, Person.class);此方法只接受成对的类型:一个用于键类,另一个用于值类 。基元作为盒装类型传递 。
4.组索引要设置可以加速复杂条件查询的多字段索引 , 可以使用@QuerySqlField.Group注解 。如果您希望一个字段成为多个组的一部分 , 您可以添加多个@QuerySqlField.Group注释 。orderedGroups
例如,在Person下面的类中,我们有一个age属于索引组的字段,该age_salary_idx组以“0”的组顺序和降序排序 。此外 , 在同一个组中,我们有salary一个组顺序为“3”和升序排序的字段 。此外,该字段salary本身是一个单列索引(index = true除了orderedGroups声明之外还指定了参数) 。组order不必是特定的数字 。只需要对特定组内的字段进行排序 。
public class Person implements Serializable {/** Indexed in a group index with "salary". */@QuerySqlField(orderedGroups = { @QuerySqlField.Group(name = "age_salary_idx", order = 0, descending = true) })private int age;/** Indexed separately and in a group index with "age". */@QuerySqlField(index = true, orderedGroups = { @QuerySqlField.Group(name = "age_salary_idx", order = 3) })private double salary;}5.使用查询实体配置索引索引和可查询字段也可以通过org.apache.ignite.cache.QueryEntity便于基于 Spring XML 的配置的类进行配置 。
作为上面基于注释的配置的一部分讨论的所有概念也适用于QueryEntity基于方法 。此外,其字段配置了@QuerySqlField注解并注册到CacheConfiguration.setIndexedTypes()方法的类型在内部转换为查询实体 。
下面的示例展示了如何定义单个字段索引、组索引和可查询字段 。
CacheConfiguration<Long, Person> cache = new CacheConfiguration<Long, Person>("myCache");QueryEntity queryEntity = new QueryEntity();queryEntity.setKeyFieldName("id").setKeyType(Long.class.getName()).setValueType(Person.class.getName());LinkedHashMap<String, String> fields = new LinkedHashMap<>();fields.put("id", "java.lang.Long");fields.put("name", "java.lang.String");fields.put("salary", "java.lang.Long");queryEntity.setFields(fields);queryEntity.setIndexes(Arrays.asList(new QueryIndex("name"),new QueryIndex(Arrays.asList("id", "salary"), QueryIndexType.SORTED)));cache.setQueryEntities(Arrays.asList(queryEntity));在这种情况下,我们的表名将是Person(模式名称的使用和定义在Schemas页面上进行了解释) 。
定义好之后,就QueryEntity可以按如下方式执行 SQL 查询:
SqlFieldsQuery qry = new SqlFieldsQuery("SELECT id, name FROM Person" + "WHERE id > 1500 LIMIT 10");6.配置索引内联大小适当的索引内联大小可以帮助加快对索引字段的查询 。有关如何选择合适的内联大小的信息,请参阅SQL 调优指南中的专门部分 。
在大多数情况下,您只需为可变长度字段(例如字符串或数组)上的索引设置内联大小 。默认值为 10 。
您可以通过设置来更改默认值

  • 每个索引单独的内联大?。?或
  • CacheConfiguration.sqlIndexMaxInlineSize给定缓存中所有索引的属性,或
  • IGNITE_MAX_INDEX_PAYLOAD_SIZE集群中所有索引的系统属性
设置按上面列出的顺序应用 。
您还可以单独为每个索引配置内联大?。?这将覆盖默认值 。要为用户定义的索引设置索引内联大小,请使用以下方法之一 。在所有情况下,该值都以字节为单位 。
  • 使用注解时:
@QuerySqlField(index = true, inlineSize = 13)private String country;
  • 使用时QueryEntity:
QueryIndex idx = new QueryIndex("country");idx.setInlineSize(13);queryEntity.setIndexes(Arrays.asList(idx));
  • 如果您使用该CREATE INDEX命令创建索引,则可以使用该INLINE_SIZE选项设置内联大?。?/li>
create index country_idx on Person (country) INLINE_SIZE 13;

推荐阅读