2013-05-30 79 views
1

我正在使用JDO编写基于emailid的用户列表的云端点API。我传递EMAILID作为@Named参数的API方法并将其添加到查询过滤器和我得到的错误信息“表达的部分无法解析:@ gmail.com”带特殊字符的gae jdoquery参数

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

如何在电子邮件中将特殊字符的参数传递给查询过滤器?

回答

2

您不会在文本字符串中嵌入文本字符串。而是定义参数,并将参数值提供给​​。

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。我强烈建议你阅读它们

+0

感谢您的帮助!但是做出这些改变是行不通的。我得到错误“javax.jdo.JDOFatalUserException:解析查询时出现意外的表达式类型。GAE(email)不支持的变量” –

+0

如果电子邮件和角色是Person类中的字段,那么在该语句中没有变量。事实。如果你真的想要说你的领域人(未发布的类)是emailId,然后把emailId。任何阅读这样的问题的人都不能期望成为心理上的 – DataNucleus

+0

是'emailId'和'role'是Person类中字段的字段。 public Person validate(@Named(“emailId”)String emailId,@ Named(“role”)字符串作用,@命名(“pwd”)字符串pwd){ \t \t Person person = new Person(); \t \t \t \t PersistenceManager pm = getPersistenceManager(); \t \t查询q = pm.newQuery(Person.class); \t \t \t \t q.setFilter(“email ==:emailIdParam && role ==:roleParam”); \t \t Map paramValues = new HashMap(); \t \t paramValues.put(“emailIdParam”,emailId); \t \t paramValues.put(“roleParam”,role); \t \t列表 persons =(列表)q.executeWithMap(paramValues);' –