Java 数据存储获取未按键查找记录

Java 数据存储获取未按键查找记录,java,google-app-engine,google-cloud-platform,google-cloud-datastore,Java,Google App Engine,Google Cloud Platform,Google Cloud Datastore,我一直在用我的头撞击这件事已经有一段尴尬的时间了,非常感谢任何帮助。我有一个简单的场景,我试图检索和更新一个实体(如果它存在),或者创建一个新的实体(如果它不存在)。有一个父实体,该部分似乎工作正常。我创建的子密钥如下所示: Key someKey = KeyFactory.createKey(parent.getKey(), CHILD_KIND, child.getUniqueStringValue()); Key someKey = KeyFactory.createKey(parent

我一直在用我的头撞击这件事已经有一段尴尬的时间了,非常感谢任何帮助。我有一个简单的场景,我试图检索和更新一个实体(如果它存在),或者创建一个新的实体(如果它不存在)。有一个父实体,该部分似乎工作正常。我创建的子密钥如下所示:

Key someKey = KeyFactory.createKey(parent.getKey(), CHILD_KIND, child.getUniqueStringValue());
Key someKey = KeyFactory.createKey(parent.getKey(), CHILD_KIND, child.getUniqueStringValue());
Entity someChild = new Entity(CHILD_KIND, someKey);
someChild.setProperty("desc", child.getUniqueStringValue());
someChild.setProperty("createTime", child.getCreateTime());
// and then a few more values that are timestamps or null
根据我读到的文件,如果实体存在,那么对其进行get将返回实体:

Entity someChild = datastore.get(someKey);
但事实并非如此。相反,我必须做一个:

Query query = new Query(CHILD_KIND, someKey);
Entity someChild = datastore.prepare(query).asSingleEntity();
找到它。如果我尝试记录someKey.toString()值,它们在创建过程中的外观与在搜索过程中的外观相同,但只有在我执行查询而不是get时,它才能找到它们。我错过了一些愚蠢而明显的东西,在一周的时间里,搜索并没有让我有所收获,所以我感谢任何帮助

谢谢, 迈克

编辑:

为了说明如何创建子实体,如下所示:

Key someKey = KeyFactory.createKey(parent.getKey(), CHILD_KIND, child.getUniqueStringValue());
Key someKey = KeyFactory.createKey(parent.getKey(), CHILD_KIND, child.getUniqueStringValue());
Entity someChild = new Entity(CHILD_KIND, someKey);
someChild.setProperty("desc", child.getUniqueStringValue());
someChild.setProperty("createTime", child.getCreateTime());
// and then a few more values that are timestamps or null

创建子实体的方式存在问题。应该是:

Entity someChild = new Entity(CHILD_KIND, parent.getKey());


另外,我不知道为什么要使用
child.getUniqueStringValue()
而不是占用较少空间的简单长id。

问题是您混淆了父键和键

这一行:

实体someChild=新实体(子类,someKey)

创建一个类型为“CHILD\u kind”的实体,其父实体的键为“someKey”。有关详细信息,请参见本文档[1]

当您执行简单的datastore.get(key)时,您使用的是实体自己的键,而不是父键。因此,您需要做的是使用KeyFactory从其父键、种类、名称获取实体键。有关详细信息,请参见[2]和[3]

[1] - [2] -
[3] -

如何创建子实体?嗨,Andrei,我编辑了这篇文章,其中包括我如何创建子实体。谢谢,谢谢,安德烈。uniqueStringValue是我试图存储的某些数据的占位符。它对于父级应该是唯一的,但它包含对用户有价值的信息,因此它本身不是一个ID。