Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

399
Visualizações
Apache Ignite: cómo obtener un elemento en caché sin clave de afinidad

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)?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

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]
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda