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)
I’m attempting to take one list I retrieved from a datastore query, and keep only the results which are also in a list I retrieved from a list of keys. Both my lists are populated as expected, but I can’t seem to user retainAll on either one of them.
// List<Data> listOne = new ArrayList(query.execute(theQuery));
// DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
// List<Data> listTwo = new ArrayList(ds.get(keys).values());
// listOne.retainAll(listTwo);
EDIT
Ok, in an attempt to simplify, since this is apparently multiple problems in one, I have stopped using the low level API for datastore and instead of am just pulling one by one with a loop.
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);
The above works. It doesn’t throw the exception. The below does throw the exception. The only difference is the log.info. I’m stumped.
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);
You however need to put them in a
new ArrayList(). The returnedListimplementation apparently doesn’t supportretainAll(). That’s what the exception is telling you.A “plain”
ArrayListsupports it. If passing through theArrayListconstructor is not possible due to difference in generic type, then you’ll need to manually loop over it and cast each item before adding.Update: as per your update, the entities are apparently lazily loaded/filled. Most ORM’s (DataNucleus is one) may indeed do that. As I don’t use DataNucleus, I can’t go in detail how to fix that in a “nice” way. But you at least now know the root cause of the problem and it can be solved the same way as above. Fill the list
testin a loop as well.