SQL表达式一样嵌套obejct
我嵌套POJO象下面这样:SQL表达式一样嵌套obejct
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 ','
要与CQEngine嵌套对象查询的字段,你通常需要把逻辑读取里面嵌套值的属性,不在你的查询中。这样,该属性将嵌套字段暴露给您的查询,就好像它是常规/非嵌套类型的字段。
您可以在this related question中找到如何手动编写属性以读取嵌套字段的示例。如果您正在使用AttributeBytecodeGenerator
自动生成属性,那么请注意,它不是设计来产生嵌套对象的字段属性
生成自动
属性。它仅为POJO中的字段(普通旧Java对象)生成属性。
如果你的对象包含嵌套对象,那么在技术上它不是一个真正的POJO,它更像是一个对象图。
这不是AttributeBytecodeGenerator
的限制,实际上它可能会被修复,因为图可以包含一对多或多对多的关系。它通常需要人决定如何遍历图以从嵌套对象中提取有意义的值。
如果您看一下上面链接的问题中的手写属性,请考虑它实际上实现了相当复杂的图遍历算法来为该特定属性提取嵌套值。所以AttributeBytecodeGenerator
不会尝试这样做。在查询
指定路径,以嵌套值
你可能会那么想知道为什么我们(或者说CQEngine)不能指定查询路径嵌套值来代替。这涉及到性能。
CQEngine需要通过对象图的路径来嵌套值,以在属性内静态(以编程方式)指定,因为这是索引可以构建在这些嵌套值上的唯一方式。
如果情况并非如此,并且嵌套值的路径只在查询中提供,那么将无法事先为嵌套值创建索引。因此,回答查询的唯一方法是对整个集合进行强力扫描。
因此,指定如何在属性中读取嵌套值是有益的,因为它允许对嵌套值进行索引。
摘要
的TL; DR是:如果你确实需要使用带有CQEngine复杂的对象,我怕你可能需要写属性手工读取嵌套瓦莱斯!另一种选择是将您的对象图重构或拼合成实际的POJO。希望有所帮助!
感谢@npgall,据我所知,'AttributeBytecodeGenerator.createAttributes(Parent.class)'返回带有'name'和'child'键的地图...我期望得到带有'name'的平面地图,''孩子'和'child.name' attrubites –
好点。我更新了答案以提供更多关于这与'AttributeBytecodeGenerator'相关的信息 – npgall