过滤传递 GAE 数据存储中其他对象的 Ref<?> 的 属性 的对象

Filter objects passing a property of a Ref<?> of other object in GAE Datastore

我尝试了不同的类型并阅读了文档,但我无法弄清楚 属性 内部参考 <> 的过滤是可能的。

这是我的 类: 我的 Beer.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.

的商品

这是我的端点代码:

首先,我从我拥有的密钥中加载 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 的第一个项目,所以我有点迷茫。

感谢任何帮助。

关于查询,您可以将 Key<?>Key(本机低级别 api 版本)、Ref<?> 和实际实体本身视为可互换的.您可以将这四项中的任何一项传递给您的 filter() 调用。

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

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