我正在尝试使用谷歌应用引擎数据存储区,我需要在2个日期范围内获得员工的总薪水。我需要提供小时的范围,即startDate和endDate,以便我如何在数据存储上执行此操作。我在app引擎数据存储区中使用objectify。
答案 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过滤器将执行多个查询,因此内存中的方法可能会更快,具体取决于您的数据。
理想情况下,您可以将查询缩减为仅需要不等式过滤器的一个属性。