如何在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




