4
我正在尝试使用谷歌应用程序引擎数据存储,其中我需要获取2个日期范围内员工的总工资。我需要提供小时的范围,即startDate和endDate,因此我如何在数据存储上执行此操作。我在应用程序引擎数据存储中使用物化。具有多个数据存储属性上的不等式过滤器的物化/数据存储查询
我正在尝试使用谷歌应用程序引擎数据存储,其中我需要获取2个日期范围内员工的总工资。我需要提供小时的范围,即startDate和endDate,因此我如何在数据存储上执行此操作。我在应用程序引擎数据存储中使用物化。具有多个数据存储属性上的不等式过滤器的物化/数据存储查询
看看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下的章节看到的那样*不等式过滤器最多只能被一个属性'不能过滤两个不同性质的不等式过滤器,从而使得像
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();
注意的过滤器将执行多个查询,所以在内存中的做法可能会更快,这取决于你的数据。
理想情况下,您可以将查询简化为仅需要不等式过滤器的一个属性。
这是一个更好的方法,但我得到IllegalArgumentException:id:com.googlecode.objectify.Key不是受支持的属性类型。 –
@Prasanna请提供您的代码或打开一个新问题。我无法分辨你为什么从你的评论中得到一个例外。 – konqi