2013-10-10 50 views
0

我对appEnginy和objectify非常熟悉。不过,我需要从数据库中获取单行来获得一些值。我试图通过ofy().load().type(Branch.class).filter("parent_branch_id", 0).first()获取元素,但结果是FirstRef(null)。但是,当我运行以下循环:GoogleAppEngine - 使用一些自定义过滤器进行查询

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类型的。

+0

你跟你的循环得到什么结果呢? – CMDej

+0

结果仅仅是根据system.out.println格式化的分支(实际上是树节点)列表:[long] [node_name] - parent是[long] – Moby04

+0

您是否拥有id为0的父母?它是什么样的ID? Objecitfy的自动ID?因为在那种情况下,我认为你没有办法得到一个0 ID ... – CMDej

回答

1

如果你想有一个Branch为您请求的结果,我想你错过了.now()
Branch branch = ofy().load().type(Branch.class).filter("parent_branch_id", 0).first().now();

+0

但是,当我现在添加时,Netbeans强调它是一个错误... – Moby04

+0

你从Netbeans得到什么错误? – CMDej

+0

'找不到符号 符号:now() location:class Ref ' – Moby04

0

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

假设您使用的是Objectify 4,默认情况下属性不会被编入索引。您可以通过将@Index注释添加到课程中,为实体中的所有属性编制索引。 annotation reference提供了有用的信息。从Objectify API reference

+0

没有帮助,但谢谢。 – Moby04

+0

@ Moby04如果不是'first()'你使用'list()',而是保留'filter()',你会得到预期的结果吗? – tx802

0

例子:

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

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

可能"parent_branch_id"你的情况是一个长期的,在这种情况下,值必须0L而不是0