在我的缓存中,我有一个复杂的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 = ?
我在这里做错了吗?
答案 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;
}
};