Apache Ignite:SQL查询返回未声明类的字段

时间:2018-11-13 16:23:12

标签: java ignite

让我们用Ignite SQL查询可接受的类java.util.Date的单个字段来定义“ pojo”:

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

我猜H2内部结构中某个地方的保留日期为java.sql.Timestamp有助于处理SQL子句。但是为什么将它扔到外面而不是声明的类和期望类的对象呢?

一个更重要的问题是: 在哪里可以找到所有这些转换的可靠列表?

更新。在评论中回答问题

2 个答案:

答案 0 :(得分:0)

java.util.Date返回SQL(JDBC)字段,而不是对象字段。

{{1}}不是JDBC类型,因此将被转换。我不确定我是否能立即找到完整的列表,但是对于没有对应的JDBC类型的任何类型,您都可以期待转换或错误。

答案 1 :(得分:0)

如果您使用SqlQuery(而不是SqlFieldsQuery),则会得到您所期望的POJO。 SqlQuery始终返回POJO,因此您无法执行加入和分组依据之类的事情。