2016-03-25 3 views
0

Я читаю множество лиц из GAE с помощью объективизации:Как удалить набор лиц, использующих объективизации .ids()

List<CountStore> myList = ofy().load().type(CountStore.class).list(); 

Я затем процеживают и удалить некоторые из элементов MyList. Теперь я хочу удалить все идентификаторы в оставшемся списке. Я думаю, что правильный подход заключается в использовании .ids():

ofy().delete().type(CountStore.class).ids(myList); 

Но это не работает - он выходит из строя (см ниже), так как он ожидает MyList быть Long или строка. Может ли кто-нибудь посоветовать лучший способ удалить набор сущностей?

Спасибо!

java.lang.IllegalArgumentException: id '[email protected]' must be String or Long 
at com.googlecode.objectify.util.DatastoreUtils.createKey(DatastoreUtils.java:66) 
at com.googlecode.objectify.util.DatastoreUtils.createKeys(DatastoreUtils.java:112) 
at com.googlecode.objectify.impl.DeleteTypeImpl.ids(DeleteTypeImpl.java:91) 
at com.xyz.abc.CounterServlet.doGet(CountrServlet.java:45) 

...

+0

Как он не работает? Ваш пример - асинхронное удаление - вы можете добавить 'now()' для синхронной операции. – tx802

+0

Извините, я хотел добавить, что сбой при удалении - см. Выше для первых нескольких строк отчета о сбоях. –

+0

Ваш аргумент 'ids()' является списком 'Countstore' в соответствии с вашим примером кода - это должен быть список свойств' @ Id' ваших сущностей, которые будут строками или длинными. – tx802

ответ

1

Спасибо за указание на то, что массив длинных идентификаторов это все, что нужно. Ответ на самом деле довольно просто создать ArrayList идентификаторов, как я фильтруюсь те, Entities Я хочу удалить:

ArrayList<Long> idList = new ArrayList<Long>(); 

    //Do the Filtering and add IDs to the idList array the delete them all 
    ofy().delete().type(CountStore.class).ids(idList).now(); 
+1

Вы можете также просто 'iny(). Delete(). Entity (... yourlistofentities ...). Now()' – stickfigure

+0

Еще проще! Благодарю. Я получаю зависание Objectify ... –

0

Я абстрагирован поле Удалять следующим образом:

public void deleteEntities(List<BaseClass> entities){ 
     try{ 
      ofy().delete().entities(entities); 
     }catch (Exception ex) { 
      logger.error("Exception", ex); 
     } 
    } 

Затем сбрасывал производный класс объектов:

List<DerivedClass> params = receivedFromSomeOtherFunction(); 
    List<BaseCLass> params2 = new ArrayList<BaseClass>(); 
    params2.addAll(params); 

, а затем вызвать deleteEntities следующим образом:

deleteEntities(params2); 

Однако один недостаток я обнаружил, что иногда этот вызов функции требует времени, чтобы удалить все элементы, хотя вызов функции немедленно возвращается, потому что он асинхронно удаляет объекты.

 Смежные вопросы

  • Нет связанных вопросов^_^