Google app engine GoogleAppEngine-带有一些自定义过滤器的查询
我对外表和客观都很陌生。然而,我需要从数据库中获取一行,从中获取一些值。我试图通过y().load().type(Branch.class).filter(“parent\u Branch\u id”,0).first()获取元素,但结果是Google app engine GoogleAppEngine-带有一些自定义过滤器的查询,google-app-engine,objectify,Google App Engine,Objectify,我对外表和客观都很陌生。然而,我需要从数据库中获取一行,从中获取一些值。我试图通过y().load().type(Branch.class).filter(“parent\u Branch\u id”,0).first()获取元素,但结果是FirstRef(null)。但是,当我运行以下循环时: for(Branch b : ofy().load().type(Branch.class).list()) { System.out.println(b.id +". "+b.tree_lab
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);
};
我做错了什么
[编辑]
当然,分支是一个数据库实体,如果有关系的话,父分支id是long类型。如果您需要一个
分支作为请求的结果,我想您错过了一个.now()
:
Branch Branch=ofy().load().type(Branch.class).filter(“父分支id”,0).first().now()
听起来您的父分支id
属性上没有@Index
注释。当您执行y().load().type(Branch.class).list()
的操作时,Objectify有效地执行了按种类获取的批处理(如使用低级API执行查询(“Branch”)
),因此它不需要属性索引。只要添加一个过滤器()
,它就会使用一个查询
假设您使用的是Objectify 4,默认情况下不会为属性编制索引。通过向类添加@index
注释,可以为实体中的所有属性编制索引。提供了有用的信息。示例来自:
LoadResult 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\u branch\u id”
在您的情况下是一个long,在这种情况下,值必须是0L而不是0。您的循环得到了什么结果?结果只是根据system.out.println:[long][node\u name]-parent是[long]
您有id为0的父节点吗?这是什么身份证?来自Objecitfy的自动ID?因为在这种情况下,我认为不可能获得0 id…id确实是从objectify自动生成的,但列parent_branch_id指向同一表中的其他记录(它不是必需的,并且充当外键)。是的,此字段中有一条记录为0。请添加分支类的定义;很可能您缺少@Index,或者您有其他错误配置(@Parent on Parent\u branch\u id?也许它不是一个数字?)找不到symbol-symbol:now()位置:class-Ref
我从未使用过Objectify 4,即使我现在的版本3非常好。你能用一个.get()
替换.now()
吗?或者这也是一个错误吗?我现在可以用get替换,但它仍然返回null而不是result,即使有一条记录应该与筛选器匹配…你在你的分支类中有@Index
编辑过你的父分支id
字段吗?是的,我想是的。。。在Objectify 4中,默认情况下,所有变量都未编制索引。我想查询一个字段,它必须被索引。@Moby04如果您使用list()
,而不是first()
,但保留filter()
,您会得到预期的结果吗?
LoadResult<Thing> th = ofy.load().type(Thing.class).filter("foo", foo).first();
Thing th = ofy.load().type(Thing.class).filter("foo", foo).first().now();