【问题标题】:Nested entity groups in HRD datastoreHRD 数据存储中的嵌套实体组
【发布时间】:2012-04-04 02:59:46
【问题描述】:

我在 HRD 谷歌应用引擎数据存储中使用嵌套实体组。

A

所有C都在同一个实体组(A一个)吗?

我想查询所有具有相同父A的C。我该怎么做?

这是失败的: SELECT * FROM C WHERE ANCESTOR IS Key('A',1)

任何提示?

测试已经直接在数据存储区的GQL中完成了,不管怎样,我附上sn-p的代码(Ofy4代码):

那是A:

@Entity
@Cache
public class Site implements Serializable {
   private static final long serialVersionUID = 8611281648072797702L;

   @Id
   private Long id;
   private String url;
   ...
}

那是乙:

@Entity
@Cache
public class Accom implements Serializable, HasCapacity {

   @Id
   private Long id;
   @Parent
   private Key<Site> site;
   ...
}

那是C:

@Entity
@Cache
public class Room implements Serializable, HasCapacity {

   @Id
   private Long id;
   @Parent
   private Key<Accom> accom;
   ...
}

【问题讨论】:

  • 以什么方式“失败”?它是抛出异常还是不返回您知道的事实在数据库中的实体?还有什么?
  • 补充亚当所说的:你能在执行查询和堆栈跟踪的地方发布你的代码的 sn-p(如果“失败”是一个例外)
  • 没有失败。代码没有返回任何结果。我在 prod 中直接使用 GQL 进行测试。
  • 请包含您正在执行的确切 GQL - 几乎可以肯定查询的表述有问题。
  • SELECT * FROM Room WHERE ANCESTOR IS Key('Site',1) 不起作用,SELECT *WHERE ANCESTOR IS Key('Site',1) 也不返回任何房间。

标签: google-app-engine transactions google-cloud-datastore objectify gql


【解决方案1】:

根据谷歌文档,这应该可以工作。

http://code.google.com/appengine/docs/python/datastore/queries.html

祖先查询

您可以将数据存储查询过滤到指定的祖先,以便结果仅包含包含该祖先的实体。换句话说,所有的结果都会以祖先作为他们的父母,或者父母的父母,等等。传递 None 作为参数不会查询没有祖先的实体,并且会返回错误。

其他有用信息的链接: http://code.google.com/appengine/docs/python/datastore/gqlreference.html#Examples http://code.google.com/appengine/docs/python/datastore/entities.html

【讨论】:

  • 我也这么认为,但事实并非如此 :(
【解决方案2】:

问题解决了:

问题是在创建 C 时错误地创建了父键。 C 的父键是 K(B),它应该是总是包含父键的 K(A,B)。

就是这样才能引用实体组。需要对 A 的引用,因为尽管有嵌套,但只有一个实体组。

【讨论】:

    猜你喜欢
    • 2020-11-26
    • 2021-05-29
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    相关资源
    最近更新 更多