【问题标题】:gae jdoquery parameters with special characters带有特殊字符的 gae jdoquery 参数
【发布时间】:2013-05-30 11:37:53
【问题描述】:

我正在使用 JDO 编写一个云端点 api,以根据 emailid 获取用户列表。我将 emailId 作为 @Named 参数传递给 Api 方法并将其添加到查询过滤器中,我收到错误消息“无法解析表达式部分:@gmail.com”

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

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

PersistenceManager pm=getPersistenceManager();
Query q = pm.newQuery(Person.class);
q.setFilter(" email == "+emailId+" && role == "+role);

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

return person;
}

当我调用上面的 api 时,会抛出下面的错误

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)

我们如何将带有特殊字符的参数传递给查询过滤器?

【问题讨论】:

    标签: google-app-engine parameters special-characters jdo


    【解决方案1】:

    您不要在文本字符串中嵌入文本字符串。而是定义一个参数,并将参数值提供给execute()

    Query q = pm.newQuery(Person.class);
    q.setFilter("emailId == :theEmail && role == :theRole");
    Map<String, String> paramValues = new HashMap();
    paramValues.put("theEmail", myEmailParam);
    paramValues.put("theRole", myRoleParam);
    List<Person> persons = (List<Person>)q.executeWithMap(paramValues);
    

    所有这些都通过 JDO 规范和the docs for DataNucleus JDO 中的示例进行了定义。我强烈建议你阅读它们

    【讨论】:

    • 感谢您的帮助!但做出这些改变并没有奏效。我收到错误“javax.jdo.JDOFatalUserException:解析查询时出现意外的表达式类型。GAE(电子邮件)不支持的变量”
    • 如果 email 和 role 是 Person 类中的字段,则该语句中没有变量。事实。如果你真的想说你在 Person(类未发布)中的字段是 emailId,那么输入 emailId。读到这样一个问题的任何人都不能指望通灵
    • 是的 'emailId' 和 'role' 是 Person 类中作为字符串的字段。 public Person validate(@Named("emailId") String emailId,@Named("role") String role,@Named("pwd") String pwd){ Person person=new Person(); PersistenceManager pm=getPersistenceManager(); Query q = pm.newQuery(Person.class); q.setFilter("email == :emailIdParam &amp;&amp; role == :roleParam"); Map&lt;String, String&gt; paramValues = new HashMap(); paramValues.put("emailIdParam", emailId); paramValues.put("roleParam", role); List&lt;Person&gt; persons = (List&lt;Person&gt;)q.executeWithMap(paramValues);
    • 不知道你在那里尝试什么。更改查询中的字段名称,而不是参数名称!看我的回答。
    • 糟糕!犯了一个愚蠢的错误;数据存储中的字段名称是 emailId,我正在尝试使用电子邮件:P 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多