objectify查询按实体中的列表筛选包含搜索参数

sea*_*ste 7 gwt google-app-engine objectify requestfactory

在一个应用程序中,我有一个包含其他实体列表的实体(假设一个事件包含已分配员工的列表)

使用objectify - 我需要找到特定员工所分配的所有事件.

是否有一种过滤查询的基本方法,如果它包含参数 - 与查询相反的类型

...快速伪代码

findAll(Employee employee) {
  ...
  return ofy.query(Event.class).filter("employees.contains", employee).list();
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激


在看到这个http://groups.google.com/group/objectify-appengine/browse_thread/thread/77ba676192c08e20之后,我尝试过做过滤器("员工",员工)- 不幸的是,这会给我一个空列表

目前我正在做一些非常低效的事情 - 通过每个事件,遍历员工并将它们添加到新列表中,如果它包含给定员工只是为了让某些东西有效 - 我知道这不是正确的


让我添加一件事,

上面的查询实际上并不是什么,我只是使用它,因为我不认为这会有所作为.

Employee和Events与Business作为父级位于同一实体组中

我正在使用的实际查询如下

ofy.query(Event.class).ancestor(businessKey).filter("employees", employee).list();
Run Code Online (Sandbox Code Playgroud)

不幸的是,这仍然是一个空列表 - 确实有祖先(键)在那里弄乱过滤器?


解决方案,员工字段未正确索引.

我添加了数据存储索引文件来创建一个复合索引,但最初测试的是我在员工字段编入索引之前添加的值,这是我做的愚蠢 - 只需在"业务"字段上创建一个索引"员工"领域修复了一切.数据存储索引文件似乎没有必要,删除后再次尝试一切正常.

sti*_*ure 4

通常,您可以通过以下两种方式之一执行此操作:

Put a property of Set<Key<Employee>> on the Event
Run Code Online (Sandbox Code Playgroud)

或者

Put a property of Set<Key<Event>> on the Employee
Run Code Online (Sandbox Code Playgroud)

您还可以创建一个关系实体,但如果您只是对计数相对较低的值进行过滤,通常将 set 属性放在一个实体或另一个实体上会更容易。

然后按照您的描述进行过滤:

ofy.query(Event.class).filter("employees", employee).list()
Run Code Online (Sandbox Code Playgroud)

或者

ofy.query(Employee.class).filter("events", event).list()
Run Code Online (Sandbox Code Playgroud)

列表属性应该保存目标实体的键。如果您将实体传递给 filter() 方法,Objectify 将理解您想要按键进行过滤。