【问题标题】:Filter objects passing a property of a Ref<?> of other object in GAE Datastore过滤传递 GAE 数据存储中其他对象的 Ref<?> 属性的对象
【发布时间】:2016-02-05 02:04:13
【问题描述】:

我尝试了不同的类型并阅读了文档,但我无法确定过滤属性内幕 Ref 是可能的。

这是我的课程: 我的啤酒.class

@Entity 
public class Beer {

@Id
private Long keyBeer;

@Load
@Index
Ref<BeerBrand> beerBrandRef;
}

这就是 Item.class

@Entity
public class Item {

@Index
@Load
Ref<Beer> beerRef;
..Fields
}

我正在尝试按beerBrandRef 过滤项目。例如,对于特定品牌,我需要列出所有具有 beerBrandRef 的商品。

这是我的端点代码:

首先我从我拥有的 Key 中加载 beerBrandRef:

BeerBrand tmpBrand = ofy().load().type(BeerBrand.class)
            .id(pBrandKey).now();

然后我尝试在过滤器中传递 Ref:

items = ofy().load().type(Item.class)
                .filter("beerRef.beerBrandRef", tmpBrand)
                .list();

有可能吗?如果没有,我如何构建我的数据存储以使这种搜索工作(不一定使用 Ref)

Ps:这是我第一个使用 GAE、Datastore 和 Objectify 的项目,所以我有点迷茫。

感谢您的帮助。

【问题讨论】:

    标签: java google-app-engine google-cloud-datastore objectify


    【解决方案1】:

    关于查询,您可以将Key&lt;?&gt;Key(本机低级 api 版本)、Ref&lt;?&gt; 和实际实体本身视为可互换的。您可以将这四项中的任何一项传递给您的 filter() 呼叫。

    更新:您是对的 - 您不能在 GAE 查询中表达联接。这并不是说您不能进行连接,您只需要在自己的代码中手动完成它们 - 您是查询计划者。同样的规则也适用于聚合。对于简单的连接和聚合,这可以正常工作,但它当然有限制。

    数据存储区非常适合作为交易存储区和权威的事实来源,但对于分析来说却很糟糕。我的建议是将相关数据位复制到真正的 RDMBS 中,无论是 Cloud SQL 还是 Postgres(其驱动程序一直在为我提供开箱即用的 GAE 工作)。使用任务队列。这对我来说效果很好,并提供了两全其美的效果 - 数据存储的无限扩展和零维护,以及 RDBMS 的灵活性。

    【讨论】:

    • 是的,我可以通过 I Ref&lt;?&gt;Key&lt;?&gt;Key 来过滤我当前实体的属性。在上面的示例中,如果我将 Ref&lt;?&gt; 传递给过滤 beerRef,它将完美运行。但我想做的是更深入一点,在实体BeerBrand 中过滤Ref&lt;?&gt;,返回实体Item 的列表。当我阅读(书籍和文档)时,我几乎可以肯定这是不可能的,因为它类似于 SQL 数据库中的 JOIN。但我只想得到更了解它的人的确认。感谢您的回复棒图。我是你的粉丝。
    猜你喜欢
    • 1970-01-01
    • 2021-03-21
    • 2018-12-25
    • 2018-04-07
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多