我正在使用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)
...
答案 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);
然而,我发现有一个缺点是有时这个函数调用需要时间来删除所有元素,尽管函数调用可能会立即返回,因为它会异步删除对象。