2013-10-10 36 views
2

是否可以通過僅返回具有特定列表字段爲空的實體來過濾對象中的實體?僅返回列表字段爲空的實體Objectify

例如,如果我有一個客戶端實體,它具有類型爲List的屬性「地址」,我該如何才能返回根本沒有關聯地址的客戶端?

是否有某種「空」或「爲空」的過濾器?喜歡的東西:

ofy().load().type(Client.class).filter("address", null).list(); 

ofy().load().type(Client.class).filter("address is", null).list(); 

非常感謝。

回答

5

列表屬性由數據存儲區中缺少數據表示;沒有辦法存儲或索引「空列表」。

最好的辦法是建立一個綜合索引屬性,如「無地址」,並在@OnSave方法來填充它:

class Client { 
    ... 

    @Index(IfTrue.class) boolean addressless; 

    @OnSave void updateAddressless() { 
     this.addressless = address.isEmpty(); 
    } 
} 

您現在可以通過此過濾器。該屬性不必具有getter/setter,因此它可以從應用程序的其餘部分完全隱藏(除了作爲過濾條件)。

該策略通常適用於處理難以查詢的情況。

+0

是真的。這應該被標記爲答案! – Shaun

+0

我結束了一個類似的解決方案(將numberOfItems字段添加到我的實體中),但是在我的DAO中設置了它的值,而不是用@OnSave裝飾實體內的方法。你的解決方案肯定比min更好。非常感謝您的關注。 – iluz

0

您不能使用null值作爲其值的對象化過濾器。如何將空列表更改爲空列表?

+1

這也行不通;數據存儲中的空列表由缺少數據表示。 – stickfigure