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

时间:2015-01-23 18:35:32

标签: java google-app-engine google-cloud-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);

2 个答案:

答案 0 :(得分:2)

您的代码中存在错误。您永远不会更新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);

答案 1 :(得分:1)

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

由于某种原因,entities iterable的行为不像正确的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);