【问题标题】:objectify query filter by list in entity contains search parameter按实体中的列表进行对象化查询过滤器包含搜索参数
【发布时间】:2012-04-09 16:15:53
【问题描述】:

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

使用 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 之后,我尝试只做 filter("employees", employee) - 但不幸的是,这给我返回了一个空列表

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


让我补充一件事,

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

Employee 和 Events 位于同一个实体组中,Business 为父级

我使用的实际查询如下

ofy.query(Event.class).ancestor(businessKey).filter("employees", employee).list();

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


解决方法,employees 字段的索引不正确。

我添加了 datastore-indexes 文件来创建复合索引,但最初是在对员工字段被索引之前添加的值进行测试,这是我在做的愚蠢的事情 - 只是在“业务”上建立一个索引字段和“员工”字段修复了所有内容。 datastore-indexes 文件似乎没有必要,在删除它并再次尝试一切正常之后。

【问题讨论】:

    标签: google-app-engine gwt requestfactory objectify


    【解决方案1】:

    通常,您可以通过以下两种方式之一:

    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 将理解您希望通过键进行过滤。

    【讨论】:

    • 这实际上正是我正在做的,但由于某种原因我无法让它工作。两件事 - 我使用 List> 而不是 Set - 这会有什么不同吗?此外,它们位于以 Business 作为父级的实体组中 - 因此查询实际上是 ofy.query(Event.class).ancestor(businessKey).filter("employees", employee).list() - 但这是返回一个空列表 - 我不认为有一个祖先键的查询会搞砸任何事情
    • 列表和祖先都不应该有所作为——尽管祖先()+过滤器()可能需要一个复合索引。你有 @Indexed 员工财产吗?这将是必要的,即使使用复合索引。
    • @vandus 由于 sean christie 似乎没有回答,您是否设法完成这项工作?我做不到。
    • 不,我最终放弃了它,再也没有使用它。对不起:/
    • 如果您保存了具有索引列表属性的实体,您可以过滤该值。有用。也许您添加了@Index 并没有重新保存实体?
    【解决方案2】:

    示例: /************************************************* **/

    @实体

    @缓存

    公开课新闻{

    @Id Long id;
    String news ;
    @Index List<Long> friend_list = new ArrayList<Long>();
    

    // 可以看到我新闻的朋友,exemele :friend_list.add(id_f1);朋友列表.add(id_f2);朋友列表.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”。

    //这里 ==> .filter("friend_list in",friend_id);

    // 如果friend_list 包含“id_friend” ==> 查询返回值

        .........
    

    }

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多