在我的缓存中,我有一个复杂的 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 = ?
我在这里做错了什么吗?
您可以访问嵌套字段,但前提是它们提前配置了 QuerySqlField 注释:
class Person{
private Department d;
...
}
class Department {
@QuerySqlField
private Department code;
....
}
SqlQuery<Short, BinaryObject> query = new SqlQuery<>(Person.class, "code = ?");
Ignite SQL 不支持解构,并且没有可靠的计划来实现它。
这意味着您无法查看丰富的对象、地图、列表等字段。您应该在这里引入一个departmentId数字字段。
理论上,您也可以尝试将 @QuerySqlField 注释放在 Department 的字段
code
上,然后以 CODE = ?
的形式访问它。你的旅费可能会改变。我想听听这样的实验的结果。
我通过使用谓词解决了它。
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;
}
};