如何使用Objectify .ids删除一组实体

时间:2016-03-25 17:03:05

标签: google-app-engine objectify

我正在使用Objectify从GAE读取一组实体:

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

然后我过滤,并删除myList的一些元素。我现在想要删除剩余列表中的所有ID。我认为正确的方法是使用.ids():

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

但这不起作用 - 它崩溃(见下文),因为它期望myList是Long或String。任何人都可以建议删除一组实体的最佳方法吗?

谢谢!

java.lang.IllegalArgumentException: id 'com.xyz.abc.CountStore@53d71fff' 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)

...

2 个答案:

答案 0 :(得分:1)

感谢您指出只需要一个Long ID数组。答案真的很简单就是创建一个ID的ArrayList,因为我过滤了我要删除的实体:

  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 :(得分: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);

然而,我发现有一个缺点是有时这个函数调用需要时间来删除所有元素,尽管函数调用可能会立即返回,因为它会异步删除对象。