gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:14:25 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com