Ignite 点燃复杂java对象的SqlQuery

Ignite 点燃复杂java对象的SqlQuery,ignite,Ignite,在缓存中,我有一个复杂的java对象,如下所示- class Person{ private Department d; .... } class Department { private Department code; .... } 我正在使用下面的SQLQuery来阅读它- SqlQuery<Short, BinaryObject> query = new SqlQuery<>(Person.cla

在缓存中,我有一个复杂的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))
我的错误如下- 原因:类org.apache.ignite.internal.processors.query.IgniteSQLException:未能分析查询:选择PERSON_CACHE.PERSONENTITY.\u KEY,TPERSON_CACHE.PERSONENTITY.\u VAL来自PERSON_CACHE.PERSONENTITY,其中id.code=


我在这里做错了什么吗?

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

这意味着您不能窥视富对象、映射、列表等字段。您应该在此处引入departmentId数字字段


理论上,您也可以尝试将@QuerySqlField注释放在部门的字段代码上,然后以代码=?。您的里程可能会有所不同。就我个人而言,我想听听这种实验的结果。

我用谓词解决了这个问题

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;
        }
      };

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

class Person{
    private Department d;
    ...
}

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

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