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

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


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

最佳答案

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

10-04 11:11