使用不等数过滤器对多个数据存储区属性进行Objectify / datastore查询

时间:2015-10-17 21:02:07

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

我正在尝试使用谷歌应用引擎数据存储区,我需要在2个日期范围内获得员工的总薪水。我需要提供小时的范围,即startDate和endDate,以便我如何在数据存储上执行此操作。我在app引擎数据存储区中使用objectify。

1 个答案:

答案 0 :(得分:7)

查看objectify wiki。在执行查询部分中,有关于如何创建基本查询的示例。

让我们假设您的实体看起来像这样

@Entity
public class Salary {
  Ref<Employee> employee;
  @Id 
  Long salaryId;
  @Index
  Date startDate;
  @Index
  Date endDate;
  Long salaryCents;
}

如果要创建一个考虑最小数据和最大日期值的查询,可以链接过滤器,如下所示:

ofy().load(Salary.class).filter("startDate >", start).filter("startDate <=", end).list();

正如您可以阅读datastore docs下的* {Inequality过滤器仅限于一个属性&#39;你不能使用不等式过滤器过滤两个不同的属性,从而进行类似

的查询
ofy().load(Salary.class).filter("startDate >", start).filter("endDate <=", end).list();

不可能。

您可以做的是过滤一个属性并过滤Java代码中的内存中的其他属性。

另一种方法(尽管我还没有尝试过,但应该是可行的)是获取第一个过滤器的键列表,如下所示:

Iterable<Key<Salary>> keys = ofy().load(Salary.class).filter("startDate >", start).keys();

然后在第二个查询中使用键,如下所示:

ofy().load(Salary.class).filter("salaryId IN", keys).filter("endDate <=", end).list();

请注意,IN过滤器将执行多个查询,因此内存中的方法可能会更快,具体取决于您的数据。

理想情况下,您可以将查询缩减为仅需要不等式过滤器的一个属性。