【问题标题】:GAE Query with Collection Parameter带有集合参数的 GAE 查询
【发布时间】:2014-03-04 03:45:23
【问题描述】:

我已验证我要查找的实体在数据存储区中。我已验证我作为方法参数传递的列表包含此实体。我正在尝试查找在我传递的字符串列表中包含其“userGmail”的所有对象。

这是我的代码

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

}

这是我从中收到的堆栈跟踪:

值得注意的一点:我在传入的列表中没有收到此错误,因为它不包含在数据存储中找到的元素。就在它确实存在的时候,这让我相信 Query 已经找到了元素,但没有正确关闭或执行到返回参数中。如果最好返回列表,那就太好了。到目前为止,我已经尝试了多种变体,但没有成功。它变得非常令人沮丧。

【问题讨论】:

    标签: java google-app-engine jdo jdoql


    【解决方案1】:

    好的,所以我找到了解决方法。

    列表不能传递到 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;
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多