Apache Ignite: SQL-запрос возвращает поле с не объявленным классом - PullRequest
0 голосов
/ 13 ноября 2018

Давайте определим «pojo» с одним полем класса java.util.Date, приемлемым для запросов Ignite SQL:

public class TimeHolder {
  @QuerySqlField
  public Date date;

  public TimeHolder(Date date) {
    this.date = date;
  }
}

Теперь создайте кеш зажигания и запросите его через SQL:

    final IgniteCache<Integer, TimeHolder> timeCache = ignite.getOrCreateCache(...);
    timeCache.put(1, new TimeHolder(new Date()));
    final FieldsQueryCursor<List<?>> queryCursor = timeCache.query(new SqlFieldsQuery("select * from TimeHolder"));
    final List<?> timeHolderFields = queryCursor.iterator().next();
    final Object dateField = entityFields.iterator().next();
    assert theOnlyField.getClass() == java.sql.Timestamp.class;

Оказывается, что Object dateField не является java.util.Date, как заявлено, но java.sql.Timestamp.

Я полагаю, что удержание даты в виде java.sql.Timestamp где-то во внутренних органах H2 помогает при обработке предложений SQL. Но почему он выбрасывается наружу вместо объекта объявленного и ожидаемого класса?

И более важный вопрос: Где я могу найти достоверный список всех этих конверсий?

UPDATE. Ответы на вопросы в комментарии

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Если вы используете SqlQuery (а не SqlFieldsQuery), вы получите POJO, как вы ожидаете.SqlQuery всегда возвращает POJO, поэтому вы не можете делать такие вещи, как объединения и группирование по.

0 голосов
/ 13 ноября 2018

SqlQueryFields возвращает поля SQL (JDBC), а не поля объектов.

java.util.Date не является типом JDBC, поэтому он преобразуется.Я не уверен, что смогу сразу найти полный список, но вы можете ожидать преобразования или ошибки для любых типов, которые не имеют соответствующих типов JDBC.

...