【问题标题】:Filter Objectify query by "key" field按“关键”字段过滤 Objectify 查询
【发布时间】:2015-10-15 23:43:36
【问题描述】:

我有以下 Objectify 关系:

@Entity(“Author”)
public class Author{
  @Id
  private long authorId;
  …

}

@Entity(“Book”)
public class Book{
  @Id
  private long id;
  private Key<Author> authorKey;
  …

}

现在是有趣的部分:我有authorId(ID,而不是实体),我需要查询该作者的 Book。我的查询如下,但它返回一个空列表,而我知道这个作者在数据存储区中有书籍。那么我该如何解决这个查询呢?

public static List<Book> getBooksForAuthor(Long authorId) {
    Key<Author> authorKey = Key.create(Author.class, authorId);
    return OfyService.ofy().load().type(Book.class).filter("authorKey", authorKey).order(“-date").list();
  }

【问题讨论】:

  • 你有没有想过如何做到这一点?

标签: google-app-engine filter google-cloud-endpoints google-cloud-datastore objectify


【解决方案1】:

您需要@Index Book.authorKeyBook.date 字段。我不记得这是否需要 {authorKey, date} 上的多属性索引,但请尝试不使用它,看看它是否有效。

我还建议您将字段称为“作者”而不是“authorKey”。

【讨论】:

  • 非常感谢您的回复。我在datastore-indexes.xml 文件中创建了索引。我还把@Index 放在了authorKey 和日期上。但我仍然得到一个空的结果集。
  • 另外,在 authorKey 上我有两个注释 @Index @ApiResourceProperty(ignored = AnnotationBoolean.TRUE)。他们会互相干扰吗?我不希望客户看到 authorKey,所以我用ApiResourceProperty 向他们隐藏它。
  • 谢谢。 +1 用于重新执行 @Index。我不太确定他们。
  • datastore-indexes.xml 中的多属性索引是自动为您构建的。用@Index 标记的单一属性索引是在您保存特定实体时建立的;仅添加注释不会更改数据存储区中的数据。您必须重新保存每个特定实体。
  • 哦还有:我无法想象@ApiResourceProperty 如何以任何方式与 Objectify 的注释进行交互。 Objectify 肯定不会查看“外来”注释。
【解决方案2】:

您正在使用字段 authorId 而不是您刚刚创建的 authorKey 进行查询。

OfyService.ofy().load().type(Book.class).filter("authorKey", authorKey).order(“-date").list();

有了这个改变和索引,你应该会得到结果。

【讨论】:

  • 很抱歉给您带来了困惑。我实际上正在使用authorKey。这是我故障排除的一部分。
  • 添加索引后是否重写了实体? datastore docs- ..将属性从未索引更改为索引不会影响更改之前可能已创建的任何现有实体。对属性进行过滤的查询不会返回此类现有实体,因为实体在创建时并未写入查询的索引。为了使实体可以被以后的查询访问,您必须将它们重写到数据存储中,以便将它们输入到适当的索引中。
  • 我不知道重写的事情。不幸的是,仅仅在控制台中编辑实体是行不通的。我实际上必须重写它。
猜你喜欢
  • 2023-01-04
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
相关资源
最近更新 更多