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

时间:2012-03-26 06:11:55

标签: google-app-engine gwt requestfactory objectify

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

使用客体化 - 我需要找到特定员工所分配的所有事件。

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

中的查询相反

...快速伪代码

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

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


解决方案,员工字段未正确编入索引。

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

2 个答案:

答案 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;查询返回值

    .........

}