SqlQuery и SqlFieldsQuery

похоже, что SqlQuery поддерживает только sql, начинающийся с select *? Разве он не поддерживает другой sql, который выбирает только некоторые столбцы, такие как select id, name from person, и сопоставляет столбцы с соответствующим POJO?

Если я использую SqlFieldQuery для запуска sql, результатом будет QueryCursor списка (каждый список содержит одну запись результата). Но если sql начинается с select *, содержимое этого списка будет отличаться от запроса поля, например: select id,name,age from person

Для select * каждый список состоит из 3 частей:

  1. первый элемент - это ключ кеша

  2. второй элемент — это объект pojo, содержащий данные

  3. хвостовой элемент — это значения для каждого столбца.

Почему это было так спроектировано? Если я не знаю, какой sql запускает SqlFieldsQuery, то мне нужны дополнительные усилия, чтобы выяснить, что содержит список.


person Tom    schedule 24.12.2016    source источник
comment
Том, такие же билеты есть в IGNITE JIRA. Например: issues.apache.org/jira/browse/IGNITE-3466 В качестве обходного пути вы можете указать список столбцов и не использовать звездочку.   -  person kuaw26    schedule 25.12.2016
comment
Спасибо @kuaw26. Другой случай, когда первые два столбца, возвращаемые select *, это K и V.   -  person Tom    schedule 27.12.2016


Ответы (1)


SqlQuery возвращает объекты ключей и значений, а SqlFieldsQuery позволяет выбирать определенные поля. Какой из них использовать, зависит от вашего варианта использования.

В настоящее время select * действительно включает предопределенные поля _key и _val, и в будущем это будет улучшено. Однако, как правило, рекомендуется перечислять поля, которые вы хотите получить при выполнении SQL-запросов (это верно для любой базы данных SQL, а не только для Ignite). Таким образом, ваш код будет защищен от неожиданного поведения, например, в случае изменения схемы.

person Valentin Kulichenko    schedule 27.12.2016