【问题标题】:SQL like expression for nested obejct嵌套对象的类似 SQL 的表达式
【发布时间】:2017-10-18 08:57:07
【问题描述】:

我已经像下面这样嵌套 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 ','

【问题讨论】:

    标签: java cqengine


    【解决方案1】:

    要使用 CQEngine 查询嵌套对象中的字段,您通常需要将读取嵌套值的逻辑放在 Attribute 中,而不是在查询中。这样,该属性会将嵌套字段公开给您的查询,就好像它是常规/非嵌套类型的字段一样。

    您可以在this related question 中找到如何手动编写属性以读取嵌套字段的示例。

    自动生成属性

    如果您使用AttributeBytecodeGenerator 自动生成属性,请注意它并非旨在为嵌套对象中的字段生成属性。它只为 POJO 中的字段生成属性(普通旧 Java 对象)。

    如果您的对象包含嵌套对象,那么从技术上讲,它并不是真正的 POJO,它更像是一个对象图。

    这不是AttributeBytecodeGenerator 的限制,实际上可能已修复,因为图形可以包含一对多或多对多关系。通常需要人来决定应该如何遍历图表以从嵌套对象中提取有意义的值。

    如果您查看我上面链接的问题中的手写属性,请考虑它实际上实现了一个非常复杂的图遍历算法来仅为该特定属性获取嵌套值。所以AttributeBytecodeGenerator 不会尝试这样做。

    在查询中指定嵌套值的路径

    然后您可能想知道为什么我们(或者更确切地说是 CQEngine)不能在查询中指定嵌套值的路径。这与性能有关。

    CQEngine 需要通过对象图到嵌套值的路径,在 Attribute 中静态(以编程方式)指定,因为这是在这些嵌套值上构建索引的唯一方法。

    如果不是这种情况,并且嵌套值的路径仅在查询中提供,那么就不可能提前为嵌套值构建索引。因此,回答查询的唯一方法是对整个集合进行暴力扫描。

    因此,指定应如何在属性中读取嵌套值对性能而言是有益的,因为它允许对嵌套值进行索引。

    总结

    TL;DR 是:如果您绝对需要在 CQEngine 中使用复杂对象,恐怕您可能需要编写属性来手动读取嵌套值!另一种选择是将对象图重构或展平为实际的 POJO。希望对您有所帮助!

    【讨论】:

    • 谢谢@npgall,据我了解,AttributeBytecodeGenerator.createAttributes(Parent.class) 返回带有namechild 键的地图...我希望得到带有name,child 的平面地图和child.name 属性
    • 好点。我更新了答案以提供有关这与AttributeBytecodeGenerator 的关系的更多信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多