Как получить QueryFields из пользовательского класса при определении кэша? - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь получить данные Ignite Cache через jdbc. Для этого я определяю новый пользовательский класс и аннотирую такие поля:

public class MyClass implements Serializable {
    @QuerySqlField(index = true)
    public Integer id;

    @QuerySqlField(index = true)
    public String records_offset;

    @QuerySqlField(index = true)
    public Integer session_id;
...
}

Тогда я начинаю зажигать таким образом:

CacheConfiguration conf = new CacheConfiguration();
conf.setBackups(1);
conf.setName("test");

QueryEntity queryEntity = new QueryEntity();
queryEntity.setKeyType(Integer.class.getName());
queryEntity.setValueType(CDR.class.getName());
queryEntity.setTableName("CDR");

conf.setQueryEntities(Arrays.asList(queryEntity));
IgniteConfiguration iconf = new IgniteConfiguration();
iconf.setCacheConfiguration(conf);
iconf.setPeerClassLoadingEnabled(true);
this.ignite = Ignition.start(iconf);
this.cache = ignite.getOrCreateCache("test");

Теперь, когда я пытаюсь получить данные из JDBC, я получаю ошибку:

Error: class org.apache.ignite.binary.BinaryObjectException: Custom objects are not supported (state=50000,code=0)

Я мог бы определить набор полей, чтобы получить возможность извлекать данные из JDBC

LinkedHashMap<String, String> fields = new LinkedHashMap();
fields.put("session_id", Integer.class.getName());
fields.put("records_offset", String.class.getName());
queryEntity.setFields(fields);

Но зачем мне это делать, если я уже аннотировал поле в определении класса?

1 Ответ

0 голосов
/ 06 сентября 2018

У вас есть три варианта определения схемы SQL:

  1. Аннотации и CacheConfiguration.setIndexedTypes https://apacheignite.readme.io/docs/cache-queries#section-query-configuration-by-annotations

  2. Вы можете настроить QueryEntity: https://apacheignite.readme.io/docs/cache-queries#section-query-configuration-using-queryentity

  3. или просто используйте чистый SQL: https://apacheignite -sql.readme.io / документы / создать стол

В вашем случае вы смешали [1] и [2], поэтому вы зарегистрировали ключ и значение для индексации с помощью QueryEntity, но определили поля с аннотациями, поэтому смешивание различными способами не работает. вам нужно придерживаться, чтобы открыть определенный путь, как вы уже сделали, добавив регистрацию ключа и значения для индексации с помощью метода CacheConfiguration.setIndexedTypes. Теперь вы можете избавиться от QueryEntity.

...