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

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


public class TimeHolder {

  @QuerySqlField

  public Date date;


  public TimeHolder(Date date) {

    this.date = date;

  }

}

现在创建 ignite 缓存并通过 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 子句。但是为什么它被扔到外面而不是声明和预期类的对象呢?


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


更新。问题在评论中回答


侃侃无极
浏览 188回答 2
2回答

江户川乱折腾

如果您使用 a&nbsp;SqlQuery(而不是 a&nbsp;SqlFieldsQuery),您将获得预期的 POJO。SqlQuery总是返回一个 POJO,所以你不能做诸如加入和分组之类的事情。

湖上湖

SqlQueryFields&nbsp;返回 SQL (JDBC) 字段,而不是对象的字段。java.util.Date不是 JDBC 类型,所以它被转换了。我不确定我是否能够立即找到完整的列表,但是对于没有相应 JDBC 类型的任何类型,您可能会遇到转换或错误。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java