通过实体中的列表对象化查询过滤器包含搜索参数
在一个应用程序中,我有一个实体,其中包含其他实体的列表(假设一个事件持有分配的员工列表)
使用物化 - 我需要找到一个特定员工分配给的所有事件。
有没有一种基本的方法来过滤查询,如果它包含参数 - 与查询相反的类型
...快速伪代码
findAll(Employee employee) {
...
return ofy.query(Event.class).filter("employees.contains", employee).list();
}
任何帮助将不胜感激
我在看过这个http://groups.google.com/group/objectify-appengine/browse_thread/thread/77ba676192c08e20之后尝试过滤(“员工”,员工) - 但不幸的是,这会返回一个空列表
目前我正在做一些非常低效的事情 - 通过每个事件,遍历员工,并将其添加到新列表中,如果它包含给定的员工只是为了让事情有效 - 我知道这不是正确的
让我补充一件事,
上面的查询实际上并不是什么,我只是使用它,因为我不认为这会有所作为。
“员工”和“事件”与“业务”作为父项位于同一个实体组中
我正在使用的实际查询如下
ofy.query(Event.class).ancestor(businessKey).filter("employees", employee).list();
不幸的是,这仍然返回一个空的列表 - 是否有在那里的祖先(关键)搞砸了过滤器?
解决方案,员工领域没有正确编入索引。
我添加了datastore-indexes文件来创建一个复合索引,但最初测试的是我在雇员字段索引之前添加的一个值,这是我做的一些愚蠢的事情 - 只是在“business”字段和“员工”领域固定了一切。 数据存储索引文件看起来并不必要,在删除它之后再次尝试一切正常。
通常,您可以通过以下两种方式之一来执行此操作
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()
列表属性应该持有目标实体的密钥。 如果你将一个实体传递给filter()方法,Objectify会理解你想用键来过滤。
例如:/ *********************************************** **** /
@实体
@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 ==> .filter(“friend_list in”,friend_id);
//如果friend_list包含“id_friend”==>查询返回值
.........
}
链接地址: http://www.djcxy.com/p/58573.html上一篇: objectify query filter by list in entity contains search parameter
下一篇: Optional properties when deserializing a DataContract/Serializable mish