0

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

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")

这怎么发生的?我该如何解决这个问题并在将来避免它?

4

2 回答 2

2

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

于 2012-09-10T20:45:48.127 回答
0

电子邮件属性是您在实体上的 PK 吗?因为如果不是,那么查询它是没有意义的。一旦您使用电子邮件作为普通属性发布您的第一个查询,我假设它不会在您的 PK 上重复,因此您不能在 Key(type,email) 上使用它进行查询。

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

于 2012-09-06T00:48:08.143 回答