Что вызывает это сохранение все исключения? - PullRequest
4 голосов
/ 20 мая 2010
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);

EDIT

Хорошо, в попытке упростить, поскольку это, по-видимому, множественные проблемы в одной, я перестал использовать низкоуровневый 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);

Ответы [ 3 ]

2 голосов
/ 20 мая 2010

Это не позволит мне сделать новый ArrayList () для результата запроса, так как он возвращает массив объектов.

Однако вы должны поместить их в 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 также в цикле.

1 голос
/ 20 мая 2010

Если тип коллекции, которую вы используете для своего «списка ключей», не поддерживает retainAll, то будет выдано исключение. Какой тип вы используете?

0 голосов
/ 21 июля 2011

СОВЕТ: вам не нужно повторяться, чтобы заполнить listTwo. просто сделай:

listTwo.addAll(ds.get(keys).values())

...