在应用程序中我有一个实体,其中包含其他实体的列表(假设一个事件包含已分配员工的列表)
使用客体化 - 我需要找到特定员工所分配的所有事件。
是否有一种过滤查询的基本方法,如果它包含参数 - 与
中的查询相反...快速伪代码
findAll(Employee employee) {
...
return ofy.query(Event.class).filter("employees.contains", employee).list();
}
任何帮助将不胜感激
我在看到http://groups.google.com/group/objectify-appengine/browse_thread/thread/77ba676192c08e20后尝试过滤(“员工”,员工) - 但不幸的是,这会给我一个空列表
目前我正在做一些非常低效的事情 - 通过每个事件,遍历员工并将它们添加到新列表中,如果它包含给定员工只是为了有一些有用的东西 - 我知道这不是正确的
让我添加一件事,
上面的查询实际上并不是什么,我只是使用它,因为我认为这不会有所作为。
员工和事件属于同一实体组,其中Business为父母
我正在使用的实际查询是以下
ofy.query(Event.class).ancestor(businessKey).filter("employees", employee).list();
不幸的是,这仍然是一个空列表 - 在那里有祖先(密钥)弄乱了过滤器吗?
解决方案,员工字段未正确编入索引。
我添加了数据存储索引文件来创建一个复合索引,但最初是在我对员工字段编制索引之前添加的值进行测试,这是我做的愚蠢 - 只需要对“业务”有一个索引字段和“员工”字段修复了一切。数据存储索引文件似乎没有必要,删除后再尝试一切正常。
答案 0 :(得分:4)
通常,您可以使用以下两种方法之一:
Put a property of Set<Key<Employee>> on the Event
或
Put a property of Set<Key<Event>> on the Employee
您也可以创建关系实体,但如果您只是对计数相对较低的值进行过滤,通常只需将set属性放在一个实体或另一个实体上就可以了。
然后按照您的描述进行过滤:
ofy.query(Event.class).filter("employees", employee).list()
或
ofy.query(Employee.class).filter("events", event).list()
list属性应包含目标实体的Keys。如果您将实体传递给filter()方法,Objectify将理解您希望通过键过滤。
答案 1 :(得分:0)
示例: / ******************* ** /
@Entity
@Cache
公共课新闻{
@Id Long id;
String news ;
@Index List<Long> friend_list = new ArrayList<Long>();
//我可以看到我的新闻的朋友,exemele:friend_list.add(id_f1); friend_list.add(id_f2); friend_list.add(id_f3);
//要对“friend_list”进行操作,必须将其编入索引
}
/ ********************************************** *** /
公共新闻(Long id_f){
List<Long> friend_id = new ArrayList<Long>();
friend_id.add(id_f);
Query<Nesw> query = ofy().load().type(News.class).filter("friend_list in",friend_id).limit(limit);
//要过滤列表,请在要过滤的字段名称后面添加“IN”。
// here ==&gt; .filter(“friend_list in”,friend_id);
//如果friend_list包含“id_friend”==&gt;查询返回值
.........
}