2015-05-27 60 views
5

在Hazelcast中,是否可以根據鍵的屬性而不是值來查詢IMap?所有Hazelcast示例都顯示按價值查詢。例如,在地圖的員工與是字符串鍵一:可能通過鍵而不是Hazelcast中的值進行查詢(使用謂詞)?

IMap<String, Employee> employees; 

典型的搜索謂詞然後根據公司員工屬性(姓名,工資等)進行搜索。但我的情況下使用更復雜的按鍵,如:

IMap<DataAttributes, DataValue> myData; 

因此,如果數據屬性具有諸如:

class DataAttributes { 
    String theDescription; 
    Date theStartTime; 
    public String getDescription() { return theDescription; } 
    // etc.... 
} 

我想寫一個謂詞,可以通過按鍵查詢,返回一個合適的DataValue對象。這不起作用:

Predicate pred = Predicates.equal("description", "myDescription"); 
myData.keySet(pred); // Throws IllegalArgumentException: "There is no suitable accessor for..." 

我可以滾我,自己在this answer建議,但如果我可以,我寧願用一個徹頭徹尾的現成解決方案。

如果使用Criteria API或分佈式SQL查詢API結束,這並不重要。任何工作查詢將是偉大的。用於嵌套屬性的解決方案的獎勵點(即:DataAttributes theStartTime.getYear())。

回答

7

可以使用PredicateBuilder(com.hazelcast.query.PredicateBuilder)。所述PredicateBuilder範例允許您基於密鑰來查詢,像這樣:

EntryObject eo = new PredicateBuilder().getEntryObject(); 
Predicate fredWithStartTimeThisYear = eo.key().get("Description").equal("Fred") 
    .and(eo.key().get("theStartTime.Year").equal(2015)); 

請注意,可以通過存取器方法(「吸氣劑」)或字段名稱指代類成員,如可以在上面的示例代碼見。我在"Mastering Hazelcast"的在線書籍中找到了這些信息,可在hazelcast.org上找到(但您必須填寫一份註冊表單才能訪問它)。

+0

請注意,當大量數據加載到地圖中時,使用謂詞(在鍵或值上)非常昂貴...請小心使用此用法! – Donatello

+0

@Donatello對。我通常使用索引來緩解這一點。並使用適當的序列化器也很有幫助。 –

相關問題