Tengo dos cachés, uno es para Persona y otro para objetos de Empresa, especificando Person.Id como clave y Person.CompanyId como clave de afinidad.
personCache.Put(new AffinityKey(p1.Id, p1.CompanyId), p1); companyCache.Put(c1.Id, c1);¿Es posible obtener a la persona del caché usando Person.Id? (sin tener Person.CompanyId)?
Sí, pero no con la API Key-Value.
La API Key-Value, por definición, requiere una clave para acceder a los datos. Si su clave es AffinityKey(personId, companyId) entonces debe construir el objeto de clave completo para usar la operación IgniteCache::get .
Sin embargo, también existe la API de SQL, que es otra interfaz para acceder a los mismos datos. Puede declarar la memoria caché como una memoria caché habilitada para SQL y el personId de persona como un campo SQL en esa memoria caché.
Hay varias formas de crear una memoria caché habilitada para SQL:
Créelo con la instrucción CREATE TABLE (en lugar de especificarlo en la configuración del nodo o crearlo con el método createCache ).
Especifique indexedTypes como parte de CacheConfiguration y anote los campos de los objetos clave y de valor como @QuerySqlField .
El problema con indexedTypes es que tienes que poner anotaciones en clases. Obviamente, esto no funcionará con la clase AffinityKey , ya que no puede cambiarla.
Especifique QueryEntity como parte de CacheConfiguration .
El problema con QueryEntity es que puede volverse bastante complejo y, en general, es un poco más difícil de mantener que las anotaciones @QuerySqlField .
En su caso, recomendaría no usar la clase AffinityKey y crear su propia versión, llamémosla PersonKey . Puede anotar sus campos y usar indexedTypes .
A continuación se muestra un breve ejemplo:
public class SqlFieldInKeyExample { static class PersonKey { @QuerySqlField long personId; @QuerySqlField @AffinityKeyMapped long companyId; public PersonKey(long personId, long companyId) { this.personId = personId; this.companyId = companyId; } } static class Person { @QuerySqlField String name; public Person(String name) { this.name = name; } } public static void main(String[] args) throws IgniteException { try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) { CacheConfiguration<PersonKey, Person> cfg = new CacheConfiguration<PersonKey, Person>() .setName("PersonCache") .setIndexedTypes(PersonKey.class, Person.class); IgniteCache<PersonKey, Person> cache = ignite.createCache(cfg); cache.put(new PersonKey(9000, 42), new Person("John Doe")); List<List<?>> result = cache.query(new SqlFieldsQuery("SELECT * FROM PERSON WHERE PERSONID = 9000")).getAll(); assert result.size() == 1; System.out.println(">>>>> Person: " + result.get(0)); } } }La salida (entre otras cosas) es:
>>>>> Person: [9000, 42, John Doe]