GoogleAppEngine - 使用一些自定义过滤器进行查询

时间:2013-10-10 06:38:57

标签: google-app-engine objectify

我对appEnginy和objectify很新。但是我需要从db中获取一行以从中获取一些值。我尝试按ofy().load().type(Branch.class).filter("parent_branch_id", 0).first()获取元素,但结果为FirstRef(null)。但是,当我运行以下循环时:

for(Branch b : ofy().load().type(Branch.class).list()) {
    System.out.println(b.id +". "+b.tree_label+" - parent is " +b.parent_branch_id);
};

我做错了什么?

[编辑] Ofcourse Branch是一个数据库实体,如果重要的话,parent_branch_id的类型为long。

3 个答案:

答案 0 :(得分:1)

如果您的请求需要Branch,我认为您错过了.now()
Branch branch = ofy().load().type(Branch.class).filter("parent_branch_id", 0).first().now();

答案 1 :(得分:0)

听起来您的@Index财产上没有parent_branch_id注释。当您执行ofy().load().type(Branch.class).list()时,Objectify实际上是按类进行批处理(比如使用低级API执行Query("Branch")),因此它不需要属性索引。只要您添加filter(),它就会使用查询。

假设您使用的是Objectify 4,默认情况下不会对属性编制索引。您可以通过向类添加@Index注释来索引实体中的所有属性。 annotation reference提供了有用的信息。

答案 2 :(得分:0)

Objectify API reference的示例:

LoadResult<Thing> th = ofy.load().type(Thing.class).filter("foo", foo).first();
Thing th =       ofy.load().type(Thing.class).filter("foo", foo).first().now();

所以你需要确保成员“foo”有@Index并使用now()来获取第一个元素。如果没有找到元素,这将返回null。

在您的情况下可能"parent_branch_id"很长,在这种情况下,值必须为0L而不是0。