对象化:按 id 删除整行

Objectify: delete entire row by id

我需要检查某个字段是否包含特定的 String,如果包含 - 按 ID 删除整行。 此代码无效:

Query<Bet> query = ofy().load().type(Movie.class);

        for (Movie m : query) {
            List<String> list = m.getActors();
            String search = "Brad Pitt";
            for (String str : list) {
                if (str.trim().contains(search)) {
                    ofy().delete().type(Movie.class).id(m.getId()).now();

                }
            }
        }

在这种情况下(删除所有有布拉德皮特作为演员的电影)你可以像这样删除实体:

Query<Movie> query = ofy().load().type(User.class);

for (Movie m : query) {
    List<String> list = m.getActors();
    String search = "Brad Pitt";
    for (String str : list) {
        if (str.trim().contains(search)) {
            ofy().delete().entity(m).now();
        }
    }
}

不是我用 delete().entity(...) 删除的。另一种选择是像 delete().key(Key.create(Movie.class, idToRemove) 这样的按键删除。前者做的事情非常相似,但由于您拥有整个实体,因此不需要使事情复杂化。此外,如果您使用 entity(...) 删除,当实体具有 @Parent 时它会起作用,而如果您按键删除,则必须在 Key.create(ancestorKey, Movie.class, idToRemove).

中另外指定祖先

我经常像这样进行多次删除:

Query<Movie> query = ofy().load().type(User.class);
List<Movie> toDelete = new ArrayList<>();

for (Movie m : query) {
    List<String> list = m.getActors();
    String search = "Brad Pitt";
    for (String str : list) {
        if (str.trim().contains(search)) {
            toDelete.add(m);
        }
    }
}

ofy().delete().entities(toDelete).now();

在循环中执行数据库操作是不好的风格,应尽可能避免。

还有一点:

如果您必须通过 ID 删除实体,则该行将如下所示:

ofy().delete().type(Movie.class).id(idToDelete);

但是,正如我之前暗示的那样,如果您的 Movie class 有一个父项,这将不起作用,因为您必须始终指定整个键,因此对于祖先,该行将如下所示:

Key<MyParentClass> parent = Key.create(MyParentClass.class, myParentId);
ofy().delete().type(Movie.class).parent(parent).id(idToDelete);

相当于

ofy().delete().key(Key.create(Key.create(MyParentClass.class, myParentId), Movie.class, idToDelete));