GAE查询与集合参数

时间:2014-02-06 22:46:50

标签: java google-app-engine jdo jdoql

我已经确认我要查找的实体位于数据存储区中。我已经验证了我作为方法参数传递的列表包含此实体。我试图找到所有在我传递的字符串列表中包含'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();

}

这是我收到的堆栈跟踪: enter image description here

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

1 个答案:

答案 0 :(得分: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;

}