Ignite SqlQuery用于复杂的Java对象

时间:2018-04-03 14:58:59

标签: ignite

在我的缓存中,我有一个复杂的java对象 -

    class Person{
    private Department d;
    ....
    }
class Department {
    private Department code;
    ....
    }

我在SQLQuery下面使用它来读取它 -

     SqlQuery<Short, BinaryObject> query = new SqlQuery<>(Person.class, "d.code = ?");
String args="101"; // department code
    QueryCursor<Cache.Entry<Short, BinaryObject>> resultSet = personCache.query(query.setArgs(args))

我收到以下错误 - 引起:class org.apache.ignite.internal.processors.query.IgniteSQLException: Failed to parse query: SELECT "PERSON_CACHE"."PERSONENTITY"._KEY, "TPERSON_CACHE"."PERSONENTITY"._VAL FROM "PERSON_CACHE"."PERSONENTITY" WHERE id.code = ?

我在这里做错了吗?

3 个答案:

答案 0 :(得分:1)

您可以访问嵌套字段,但前提是它们事先配置了QuerySqlField注释:

class Person{
    private Department d;
    ...
}

class Department {
    @QuerySqlField
    private Department code;
    ....
}

SqlQuery<Short, BinaryObject> query = new SqlQuery<>(Person.class, "code = ?");

答案 1 :(得分:0)

Ignite SQL不支持解构,并且没有可靠的计划来实现它。

这意味着您无法查看富对象,地图,列表等字段。您应该在此处引入departmentId数字字段。

理论上,您还可以尝试在部门的字段code上放置@QuerySqlField注释,然后将其作为CODE = ?访问。你的旅费可能会改变。我想听听这个实验的结果。

答案 2 :(得分:0)

我通过使用谓词来解决它。

IgniteBiPredicate<Long, BinaryObject> predicate = new IgniteBiPredicate<Long, BinaryObject>() {
        @Override
        public boolean apply(Long e1, BinaryObject e2) {
          Person p= e2.deserialize();
          short s = (short) args[0];
          return p.getId().getCode == s;
        }
      };