2013-05-29 28 views
-1

我正在使用JDO編寫一個雲端點API,以根據emailid獲取用戶列表。我將電子郵件ID作爲@Named參數傳遞給電子郵件,並將其添加到查詢過濾器,並收到錯誤消息「解析查詢時出現意外的表達式類型。GAE(電子郵件)不支持的變量」gae雲端點api jdo查詢過濾器電子郵件不支持

僅供參考,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> 
} 

當我調用Validate 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) 
+0

任何異常有着堆棧跟蹤,和類型爲此事。 – DataNucleus

+0

我看到這個異常「解析查詢時意外的表達式類型,GAE(email)不支持的變量」...是不是由gae支持的電子郵件?我們能不能寫一個查詢來通過電子郵件ID來過濾一個實體? –

+0

您仍然不會提供基本信息。你有一個Person類......它是什麼?堆棧跟蹤? – DataNucleus

回答

1

您嘗試查詢提到「電子郵件」例外之我見然而,這並沒有被聲明爲查詢的參數,也不是Person的字段。因此你會得到一個你的查詢無效的例外。也許你查詢的用意是

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

emailParam被聲明並且是Person Query字段q = pm.newQuery(Person.class); q.setFilter(「email == emailparam && role ==」+ role); q.declareParameters(「String emailParam」);人=(人)q.execute(電子郵件); –

+0

「電子郵件」不是一個人的領域(emailId是),「電子郵件」不是一個參數(emailParam是)...正如已經說過的 – DataNucleus

+0

感謝您的幫助,但我看到一個不同的錯誤,我已經在下面發佈 –

-2

我改變電子郵件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) 
+3

Stackoverflow不是爲了不斷改變問題,而且你也不會添加一個答案,說你改變了一些東西......這就是更新問題的目的。這個問題得到了回答,所以你提出了一個新的問題,並完整地描述了問題。 – DataNucleus

0

問題是你沒有正確識別參數。

你的代碼改成這樣:

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