为复杂的java对象点燃SqlQuery

问题描述 投票:0回答:3

在我的缓存中,我有一个复杂的 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: Failed to parse query: SELECT "PERSON_CACHE"."PERSONENTITY"._KEY, "TPERSON_CACHE"."PERSONENTITY"._VAL FROM "PERSON_CACHE"."PERSONENTITY" WHERE id.code = ?

我在这里做错了什么吗?

ignite
3个回答
1
投票

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

class Person{
    private Department d;
    ...
}

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

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

0
投票

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

这意味着您无法查看丰富的对象、地图、列表等字段。您应该在这里引入一个departmentId数字字段。

理论上,您也可以尝试将 @QuerySqlField 注释放在 Department 的字段

code
上,然后以
CODE = ?
的形式访问它。你的旅费可能会改变。我想听听这样的实验的结果。


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;
        }
      };
© www.soinside.com 2019 - 2024. All rights reserved.