2014-02-06 60 views
0

我已验证我正在查找的实体是否在数据存储区中。我已经验证了作为方法参数传递的列表包含此实体。我正在尝试查找所有包含在我通过的字符串列表中的“userGmail”的对象。使用集合参数的GAE查询

这里是我的代码

@SuppressWarnings("unchecked") 
@ApiMethod(name = "findFriendsByEmailList") 
public CollectionResponse<ZeppaUser> findFriendsByEmailList(
     @Named("emailsList") List<String> emailsList, User user) 
     throws OAuthRequestException { 

    if (user == null) { 
     throw new OAuthRequestException(
       "Null User Authorization Exception, findFriendsByEmailList"); 
    } 

    PersistenceManager mgr = null; 
    List<ZeppaUser> execute = null; 
    Query query = null; 
    try { 
     mgr = getPersistenceManager(); 

     query = mgr.newQuery(ZeppaUser.class); 
     query.declareParameters("java.util.List emailListParam"); 
     query.setFilter("emailListParam.contains(userGmail)"); 

     execute = (List<ZeppaUser>) query.execute(emailsList); 

     query.closeAll(); 

    } finally { 
     mgr.close(); 
    } 

    return CollectionResponse.<ZeppaUser> builder().setItems(execute) 
      .build(); 

} 

这是堆栈跟踪我从中得到: enter image description here

事情值得注意:我没有收到上列出这个错误我在传递给不含数据存储中找到的元素。就在它确实存在时,这导致我相信查询已找到该元素,但尚未被正确关闭或执行到返回参数中。如果最好返回比确定更好的列表。我已经尝试过多种变化,迄今为止没有成功。它变得相当令人沮丧。

回答

0

好吧,我找到了一个方法。

列表无法传递到ApiEndpoints。这或我没有找出正确的方法来做到这一点,并会喜欢正确的方式来做到这一点。

相反,在我的客户,我建立一个逗号分隔的电子邮件的字符串,并在执行时发送一个字符串到参数为“编码”字符串列表,然后“解码”吧。工作得很好,但看起来很乱。

这里是我使用的方法。这很方便,因为它也适用于iOS。

public static String encodeListString(ArrayList<String> stringList){ 
    StringBuilder stringbuilder = new StringBuilder(); 
    stringbuilder.append(stringList.get(0)); 
    if(stringList.size() > 1){ 
     for(int i = 0; i < stringList.size(); i++){ 
      stringbuilder.append(","); 
      stringbuilder.append(stringList.get(i)); 
     } 
    } 

    return stringbuilder.toString(); 
} 

public static List<String> decodeListString(String encodedString){ 

    char[] characters = encodedString.toCharArray(); 
    StringBuilder stringbuilder = new StringBuilder(); 
    int position = 0; 
    ArrayList<String> stringList = new ArrayList<String>(); 
    while(true){ 
     try { 
     char character = characters[position]; 
     if(character == ','){ 
      String resultString = stringbuilder.toString(); 
      stringList.add(resultString); 
      stringbuilder = new StringBuilder(); // clear it 
     } else { 
      stringbuilder.append(character); 
     } 

     position++; 

     } catch (ArrayIndexOutOfBoundsException aiex){ 
      // List ended 
      String resultString = stringbuilder.toString(); 
      if(!resultString.isEmpty()) 
       stringList.add(resultString); 
      break; 
     } 

    } 

    return stringList; 

}