繁体   English   中英

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

[英]Objectify / datastore query with inequality filters on multiple datastore properties

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

看一下客观化维基 执行查询部分中,有关于如何创建基本查询的示例。

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

@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();

正如您可以在数据存储区文档中阅读*不等式过滤器最多只能限制一个属性'您不能使用不等式过滤器过滤两个不同的属性,从而使查询像

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过滤器将执行多个查询,因此内存中的方法可能会更快,具体取决于您的数据。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM