如何用Objectify在Datastore中过滤父级为null的Ent实体
解决Objectify中过滤@Parent字段为null的根节点问题
先看定义的实体类:
@Entity public class Ent implements Serializable { @Id private long key; @Parent private Key<Ent> parentKey; }
需求是筛选出parentKey为null的根节点,过程中遇到了两个问题:
- 使用
filter()方法时触发异常:
java.lang.IllegalArgumentException: @Parent fields cannot be filtered on. Perhaps you wish to use filterKey() or ancestor() instead?
- 改用
ancestor()方法时触发空指针:
javax.servlet.ServletException: java.lang.NullPointerException: Cannot invoke "Object.getClass()" because "pojo" is null
...(省略堆栈信息)
问题原因与解决方法
Objectify的@Parent注解有特殊作用:它会将父实体的Key编码到当前实体的完整Key中,形成层级化的实体Key。但如果你的数据并没有把parentKey编码到实体Key里,这个注解就不符合实际存储结构,导致查询逻辑混乱。
你最终发现的解决方法是正确的:移除@Parent注解。移除后,parentKey就变成了普通的实体字段,此时直接用filter("parentKey", null)就能正常筛选出根节点了。
另外补充一点:如果是正确使用@Parent注解的场景(实体Key包含父Key),根节点本身就没有父级,此时不需要额外过滤,直接查询Ent类的所有实体、不带任何ancestor条件,得到的就是所有根节点。
内容的提问来源于stack exchange,提问作者nazgul
相关产品推荐
相关产品推荐

