【问题标题】:gae cloud endpoint api jdo query filter email not supported不支持 gae 云端点 api jdo 查询过滤器电子邮件
【发布时间】:2013-05-25 04:18:06
【问题描述】:

我正在编写一个使用 JDO 的云端点 api,以根据 emailid 获取用户列表。我将电子邮件 ID 作为 @Named 参数传递给电子邮件并将其添加到查询过滤器中,我收到错误消息“解析查询时出现意外的表达式类型。GAE(电子邮件)不支持的变量”

仅供参考,gae 版本是 1.8

@Api (name="MyAppname", version="v1")
public class PersonEndpoint {

public Person validate(@Named("email") String email, @Named("role") String role){
    .......

    PersistenceManager pm=getPersistenceManager();
    Query q = pm.newQuery(Person.class);

    q.setFilter(" email == emailParam && role == "+role);
    q.declareParameters("String emailParam");

    try{
        person=(Person)q.execute(email);
    }finally{
        q.closeAll();
        pm.close();
    }

    return person;
}

}

有什么建议吗?

这是 Person 类

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Person {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
    @Persistent
private String emailId;
    @Persistent
private String role;
    <getters and setters here>
}

我在调用验证 API 时看到的异常

javax.jdo.JDOFatalUserException: Unexpected expression type while parsing query. Variables not supported by GAE (email)
at org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:498)
at org.datanucleus.api.jdo.JDOQuery.execute(JDOQuery.java:252)

【问题讨论】:

  • 任何异常都有一个堆栈跟踪和一个类型。
  • 我看到这个异常“解析查询时出现意外的表达式类型。GAE(电子邮件)不支持的变量”...... gae 不支持电子邮件吗?我们不能编写查询来通过电子邮件 ID 过滤实体吗?
  • 您仍然没有提供基本信息。你有一个 Person 类......它是什么?堆栈跟踪?
  • 已经编辑了我的问题,提供了 Person 类的详细信息和异常的堆栈跟踪。希望这就够了

标签: google-app-engine email filter jdo notsupportedexception


【解决方案1】:

您尝试引用“email”的查询,但这并未声明为查询的参数,也不是Person 的字段。因此,您会得到一个异常,即您的查询无效。也许您的查询是为了

"emailId == emailParam && role == "+role

【讨论】:

  • emailParam 被声明为 Person Query 的一个字段 q = pm.newQuery(Person.class); q.setFilter(" email == emailParam && role == "+role); q.declareParameters("String emailParam"); person=(Person)q.execute(email);
  • “email”不是Person的字段(emailId是),“email”不是参数(emailParam是)...如前所述
  • 感谢您的帮助,但我看到了一个不同的错误,我在下面发布了
【解决方案2】:

问题是您没有正确识别参数。

将您的代码更改为:

Query q = pm.newQuery(Person.class);
q.declareParameters("String emailParam, String roleParam");
q.setFilter(" emailId == emailParam && role == roleParam");
q.setUnique(true); // This is needed if only returning one object otherwise it returns a list

try{
    person=(Person)q.execute(emailId, role);

【讨论】:

    【解决方案3】:

    我将电子邮件更改为 emailId,现在没有使用 emailParam,因为我使用的是传递给 api 方法的 emailId。所以现在的代码看起来像

    public Person validate(@Named("emailId") String emailId, @Named("role") String role){
         Query q = pm.newQuery(Person.class);
        q.setFilter(" email == "+emailId+" && role == "+role);
                person=(Person)q.execute();
    
    }
    

    现在我看到了一个不同的错误,因为电子邮件 ID 中的 @。我们如何将这些参数传递给查询?

    javax.jdo.JDOUserException: Portion of expression could not be parsed: @gmail.com && role == collector
    at org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:519)
    at org.datanucleus.api.jdo.JDOQuery.execute(JDOQuery.java:230)
    

    【讨论】:

    • Stackoverflow 不适用于不断变化的问题,并且您不会添加回答说您更改了某些内容......这就是更新问题的目的。此问题已得到解答,因此您提出了一个新问题并完整描述了该问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 2011-07-30
    相关资源
    最近更新 更多