AppEngine数据存储区查询具有给定属性的所有实体(Java)

时间:2014-03-05 13:52:19

标签: java google-app-engine google-cloud-datastore

我试图找出一种优雅的方法来查询AppEngine数据存储区中具有特定属性的所有实体。由于缺少属性的实体不包含在索引中,基本上我想要做的是检索给定属性的索引。我确信有可能做类似的事情:

Filter bigger = new FilterPredicate(PROPERTY,
                  FilterOperator.GREATER_THAN_OR_EQUAL,
                  0);

Filter smaller = new FilterPredicate(PROPERTY,
                  FilterOperator.LESS_THAN_OR_EQUAL,
                  0);

Filter present = CompositeFilterOperator.or(bigger, smaller);

Query q = new Query(KIND).setFilter(present);

但它看起来不是一个非常优雅(或高效)的解决方案。有没有人有更好的主意?

2 个答案:

答案 0 :(得分:4)

如果您不需要具有空值的实体,则可以使用:

Filter filter = new FilterPredicate(PROPERTY, FilterOperator.NOT_EQUAL, null);

它可能看起来更简单,但NOT_EQUAL过滤器实际上会导致两个单独的查询 - 就像您的解决方案一样,除非App Engine对空值很聪明 - 我不知道。

答案 1 :(得分:2)

我感兴趣的属性实际上是一个可能包含大量值的列表,因此我决定将其保留为未索引,并添加一个单独的布尔属性HAS_LIST。这允许我以稍微更大的实体为代价对结果进行单个查询。仍然不是一个非常优雅的解决方案,但可能会更有效率。