如何在 AppEngine 数据存储上执行批量更新

How to perform bulk update on AppEngine Datastore

以下代码无效。有谁知道我如何让它工作?

Query q = new Query("Product");
    Iterable<Entity> entities = datastore.prepare(q).asIterable();
    for (Entity entity : datastore.prepare(q).asIterable()) {
        entity.setProperty(“sale”, false);
    }
    datastore.put(entities);

sale 是我添加到实体种类中的全新字段。所以它还不存在。

更新

我按如下方式修复了它,但代码仍然无法正常工作

Query q = new Query("Product");
    Iterable<Entity> entities = datastore.prepare(q).asIterable();
    for (Entity entity : entities) {
        entity.setProperty(“sale”, false);
    }
    datastore.put(entities);

您的代码有错误。你从不更新 entities。应该是:

Query q = new Query("Product");
List<Entity> entities = datastore.prepare(q).asList(FetchOptions.Builder.withDefaults());

for (Entity entity : entities) {
    entity.setProperty(“sale”, false);
}
datastore.put(entities);

也许其他人可以向您解释为什么它不起作用,但我知道如何使它起作用。

出于某种原因,entities 可迭代对象的行为不像正常的 Java 集合。在 Java 集合中,元素是指针。但无论出于何种原因,您在 for 循环中获得的每个实体都是一个独立的深层副本。因此,改为执行以下操作,它将起作用

    Query q = new Query("Product");
    List<Entity> products = new ArrayList<Entity>();
    for (Entity entity : datastore.prepare(q).asIterable()) {
        entity.setProperty("sale", false);
        products.add(entity);
    }
    datastore.put(products);