java - 是什么原因导致此 retainAll 异常?

标签 java collections google-cloud-datastore

java.lang.UnsupportedOperationException: This operation is not supported on Query Results
    at org.datanucleus.store.query.AbstractQueryResult.contains(AbstractQueryResult.java:250)
    at java.util.AbstractCollection.retainAll(AbstractCollection.java:369)
    at namespace.MyServlet.doGet(MyServlet.java:101)

我正在尝试获取从数据存储区查询中检索到的一个列表,并仅保留也在从键列表中检索到的列表中的结果。我的两个列表都按预期填充,但我似乎无法在其中任何一个上使用 retainAll。

//           List<Data> listOne = new ArrayList(query.execute(theQuery));
//           DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
//           List<Data> listTwo = new ArrayList(ds.get(keys).values());
//           listOne.retainAll(listTwo);

编辑

好吧,为了简化,因为这显然是一个问题中的多个问题,我已经停止使用数据存储的低级 API,而不是通过循环一个一个地提取。

                List<MyClass> test = (List<MyClass>) query.execute();
                List<MyClass> test2 = new ArrayList<MyClass>();

                for (String key : favorites) {
                    test2.add(pm.getObjectById(MyClass.class, key));
                }

                log.info(test.toString());
                test.retainAll(test2);

以上作品。它不会抛出异常。下面确实抛出异常。唯一的区别是 log.info。我很难过。

                List<MyClass> test = (List<MyClass>) query.execute();
                List<MyClass> test2 = new ArrayList<MyClass>();

                for (String key : favorites) {
                    test2.add(pm.getObjectById(MyClass.class, key));
                }

                test.retainAll(test2);

最佳答案

It will not let me do new ArrayList() on the query result since it returns an array of objects.

但是您需要将它们放入 new ArrayList() 中。返回的 List 实现显然不支持 retainAll()。这就是异常告诉您的内容。

“普通”ArrayList 支持它。如果由于泛型类型的不同而无法通过 ArrayList 构造函数,那么您需要手动循环它并在添加之前强制转换每个项目。

List<Data> listTwo = new ArrayList<Data>();
for (Object object : ds.get(keys).values()) {
    listTwo.add((Data) object);
}
listOne.retainAll(listTwo);

更新:根据您的更新,实体显然是延迟加载/填充的。大多数 ORM(DataNucleus 就是其中之一)确实可以做到这一点。由于我不使用 DataNucleus,因此无法详细说明如何以“良好”的方式修复它。但是你至少现在知道了问题的根本原因,并且可以按照上面的方法解决。也在循环中填充列表 test

关于java - 是什么原因导致此 retainAll 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2870415/

相关文章:

java - 在intellij中安装or-tools库

java - Jaxb 解码 : not getting my collection elements

c# - IList 和 IList<T> 有什么区别

java - 上传两个文件和一个对象失败并出现错误 415

java - 未从 Android Geofence 事件中收到 Intent

java - 使用 Jena、Sparql 和初始 DBPedia URI 进行简单深度搜索

java - 取消排序 Hashtable 中的排序对象

google-app-engine - 增加 Google App Engine 上的模型数量会影响性能吗?

java - 在 Google 数据存储中使用不完整的 key 调用 get?

python - 如何检索和操作 ndb StructuredProperty 对象?