2012-09-05 83 views
0

我在数据存储中存在实体。我可以通过属性查询如发现管理控制台:Appengine数据存储无法通过未编码密钥找到现有实体

SELECT * FROM UserEntry where email = '[email protected]' 

并且还通过编码的钥匙串进行查询,如:

SELECT * FROM UserEntry where __key__ = KEY('cy1hcHByIAsSCVVzZXJFbnRyeM') 

然而,当我查询的未编码的关键实体,它不是发现:

SELECT * where __key__ = KEY('UserEntry','[email protected]') 

从以前的查询中,我可以验证该键是否正确,并且相同的查询适用于相同类型的其他实体。

我遇到相同的行为,当我尝试通过JDO API来访问实体:

pm.getObjectById(UserEntry.class, "[email protected]"); 

该代码产生以下异常:

javax.jdo.JDOObjectNotFoundException: Could not retrieve entity of kind UserEntry with key UserEntry("[email protected]") 

这是怎么回事?我怎样才能解决这个问题,并在将来避免它?

+0

如果您发布* actual *值而不是'cy1hcHByIAsSCVVzZXJFbnRyeM'和“[email protected]”,这将有所帮助。然后我可以很容易地检查这些是否相同。你给的不是; 'cy ... eM'甚至不是一个有效的密钥。 –

+0

实际值是我们用户的电子邮件地址,这是一种私人信息..但我可以向您保证编码密钥的名称正确解码给定的电子邮件。 –

+0

所以你说只有一个关键字和一个关键字,使用KEY进行查询('sdfasdfasdfasfsdfasdfsd'),但使用KEY('classname','keyname')的相同查询失败?始终如一?你不能用其他键重现?那么请私下向我发送详细信息。 –

回答

2

离线时,我们发现urlsafe密钥字符串会对用户名添加空格进行编码,就像编码为KEY('UserEntry','[email protected] ')一样。这似乎是程序中的输入验证错误。

+0

感谢您指认,Guido。愚蠢的我忽略了这一点。 –

0

电子邮件属性是您在实体上的PK吗?因为如果不是,查询它没有意义。一旦您将第一个查询与电子邮件一起作为普通属性发布,我认为它不会在您的PK上重复,因此您无法在Key(类型,电子邮件)上使用它进行查询。

在管理控制台上获取实体后,单击key属性以确保电子邮件是密钥的一部分。

+0

“email”属性不是实体上的PK。该电子邮件地址既在PK和“电子邮件”属性 - 它重复,因为属性“电子邮件”用作联系地址,用户可以更改它。 在管理控制台的实体详细信息中,它会显示“解码实体密钥:UserEntry:[email protected]” –

相关问题