Appengine数据存储区无法通过未编码的密钥找到现有实体

时间:2012-09-05 20:09:03

标签: java google-app-engine google-cloud-datastore

我在数据存储区中有现有实体。我可以通过属性查询找到它的管理控制台,例如:

SELECT * FROM UserEntry where email = 'user@mail.com'

并且还通过编码的密钥字符串查询它,例如:

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

但是,当我通过未编码的密钥查询实体时,找不到它:

SELECT * where __key__ = KEY('UserEntry','user@mail.com')

从以前的查询中我可以验证密钥是否正确,同一查询是否适用于同类型的其他实体。

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

pm.getObjectById(UserEntry.class, "user@mail.com");

此代码导致以下异常:

javax.jdo.JDOObjectNotFoundException: Could not retrieve entity of kind UserEntry with key UserEntry("user@mail.com")

这是怎么发生的?如何解决此问题并在将来避免使用它?

2 个答案:

答案 0 :(得分:2)

离线我们发现urlsafe密钥字符串为添加了空格的用户名进行编码,就好像它编码为KEY('UserEntry','user@mail.com ')一样。这似乎是程序中的输入验证错误。

答案 1 :(得分:0)

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

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