2015-10-17 149 views

回答

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下的章节看到的那样*不等式过滤器最多只能被一个属性'不能过滤两个不同性质的不等式过滤器,从而使得像

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

注意的过滤器将执行多个查询,所以在内存中的做法可能会更快,这取决于你的数据。

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

+0

这是一个更好的方法,但我得到IllegalArgumentException:id:com.googlecode.objectify.Key不是受支持的属性类型。 –

+0

@Prasanna请提供您的代码或打开一个新问题。我无法分辨你为什么从你的评论中得到一个例外。 – konqi