我已经嵌套了POJO,如下所示:
class Parent{
String name;
Child child;
}
class Child{
String name;
}
类似于sql的查询与名称匹配的是什么?
到目前为止,我有这个:
CQNParser<Parent> parser = CQNParser.forPojoWithAttributes(Parent.class, AttributeBytecodeGenerator.createAttributes(Parent.class));
ParseResult<Notification> parseResult = parser.parse("equal(\"child\".\"name\" , \"John\")");
Prent p = new Parent().setChild(new Child().setName("John"));
boolean matches = parseResult.getQuery().matches(p, parseResult.getQueryOptions());
哪个给我
Failed to parse query at line 1:21: mismatched input '.' expecting ','
答案 0 :(得分:1)
要使用CQEngine查询嵌套对象中的字段,通常需要使用逻辑来读取属性内的嵌套值,而不是查询内部。这样,该属性就会将嵌套字段公开给您的查询,就像它是常规/非嵌套类型的字段一样。
您可以找到一个示例,了解如何手动编写属性以读取this related question中的嵌套字段。
自动生成属性
如果您使用AttributeBytecodeGenerator
自动生成属性,请注意它不是为嵌套对象中的字段生成属性而设计的。它仅为POJO中的字段生成属性(Plain Old Java Objects)。
如果你的对象包含嵌套对象,那么从技术上讲它并不是一个真正的POJO,它更像是一个对象图。
这不是AttributeBytecodeGenerator
可能实际修复的限制,因为图形可以包含一对多或多对多关系。通常需要人来决定如何遍历图形以从嵌套对象中提取有意义的值。
如果您查看我上面链接的问题中的手写属性,请考虑它实际上实现了一个非常复杂的图遍历算法来获取该特定属性的嵌套值。因此AttributeBytecodeGenerator
不会尝试这样做。
指定查询中嵌套值的路径
您可能会想知道为什么我们(或者更确切地说CQEngine)无法在查询中指定嵌套值的路径。这与绩效有关。
CQEngine需要通过对象图形到嵌套值的路径,以便在Attribute内部以静态方式(以编程方式)指定,因为这是可以在这些嵌套值上构建索引的唯一方法。
如果不是这种情况,并且嵌套值的路径仅在查询中提供,则不可能事先在嵌套值上构建索引。因此,回答查询的唯一方法是对整个集合进行强力扫描。
因此,指定如何在属性中读取嵌套值是有益的,因为它允许嵌套值被索引。
<强>摘要强>
TL; DR是:如果您绝对需要使用CQEngine的复杂对象,我恐怕您可能需要编写属性来手动读取嵌套值!另一种方法是将对象图重构或展平为实际的POJO。希望有所帮助!