You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在Objectify投影查询中同时获取实体ID?

解决Objectify投影查询获取实体ID的问题

嘿,这个问题我之前用Objectify操作Datastore的时候也踩过坑!确实直接把id放进project()方法里是无效的,因为Datastore的投影查询不支持直接投影实体ID,但我们可以通过投影实体的键(__key__)来间接拿到ID,下面是具体的修改方案:

方案一:投影__key__并提取ID

实体的ID是其键(Key)的一部分,所以我们可以把__key__加入投影字段,之后从返回的实体键中解析出ID。

修改后的查询代码

List<Item> items = ofy().load().type(Item.class)
    .filter("shopId", shopId)
    .filter("name >=", name)
    .filter("name <=", name + "�")
    .order("-creationTime")
    .project("name", "imageUrl", "__key__") // 添加__key__到投影列表
    .list();

解析ID的步骤

首先确保你的Item实体类中包含键对应的字段,用@Key注解声明即可:

@Entity
public class Item {
    @Id
    private Long id;
    @Key // 这个字段会被Objectify自动填充实体的键
    private Key<Item> key;
    private String name;
    private String imageUrl;
    // 省略其他字段、getter和setter
}

之后遍历查询结果时,就能从键中提取ID:

for (Item item : items) {
    Long entityId = item.getKey().getId(); // 从键中获取Long型ID
    // 如果是字符串ID,用item.getKey().getName()即可
    String itemName = item.getName();
    String itemImageUrl = item.getImageUrl();
    // 这里处理你的业务逻辑
}

额外说明

  • 为啥直接投影id不行?因为Datastore的投影查询只支持投影实体的普通属性字段,而id属于实体键的一部分,并非普通属性,所以得通过投影键来间接获取。
  • 这个方法完全保留了投影查询的性能优势,不会因为获取ID而加载多余的字段。

内容的提问来源于stack exchange,提问作者Anmol Vijaywargiya

火山引擎 最新活动