2017-10-18 75 views
0

我嵌套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 ','

回答

0

要與CQEngine嵌套對象查詢的字段,你通常需要把邏輯讀取裏面嵌套值的屬性,不在你的查詢中。這樣,該屬性將嵌套字段暴露給您的查詢,就好像它是常規/非嵌套類型的字段。

您可以在this related question中找到如何手動編寫屬性以讀取嵌套字段的示例。如果您正在使用AttributeBytecodeGenerator自動生成屬性,那麼請注意,它不是設計來產生嵌套對象的字段屬性

生成自動

屬性。它僅爲POJO中的字段(普通舊Java對象)生成屬性。

如果你的對象包含嵌套對象,那麼在技術上它不是一個真正的POJO,它更像是一個對象圖。

這不是AttributeBytecodeGenerator的限制,實際上它可能會被修復,因爲圖可以包含一對多或多對多的關係。它通常需要人決定如何遍歷圖以從嵌套對象中提取有意義的值。

如果您看一下上面鏈接的問題中的手寫屬性,請考慮它實際上實現了相當複雜的圖遍歷算法來爲該特定屬性提取嵌套值。所以AttributeBytecodeGenerator不會嘗試這樣做。在查詢

指定路徑,以嵌套值

你可能會那麼想知道爲什麼我們(或者說CQEngine)不能指定查詢路徑嵌套值來代替。這涉及到性能。

CQEngine需要通過對象圖的路徑來嵌套值,以在屬性內靜態(以編程方式)指定,因爲這是索引可以構建在這些嵌套值上的唯一方式。

如果情況並非如此,並且嵌套值的路徑只在查詢中提供,那麼將無法事先爲嵌套值創建索引。因此,回答查詢的唯一方法是對整個集合進行強力掃描。

因此,指定如何在屬性中讀取嵌套值是有益的,因爲它允許對嵌套值進行索引。

摘要

的TL; DR是:如果你確實需要使用帶有CQEngine複雜的對象,我怕你可能需要寫屬性手工讀取嵌套瓦萊斯!另一種選擇是將您的對象圖重構或拼合成實際的POJO。希望有所幫助!

+0

感謝@npgall,據我所知,'AttributeBytecodeGenerator.createAttributes(Parent.class)'返回帶有'name'和'child'鍵的地圖...我期望得到帶有'name'的平面地圖,''孩子'和'child.name' attrubites –

+0

好點。我更新了答案以提供更多關於這與'AttributeBytecodeGenerator'相關的信息 – npgall