ObjectBox:获取具有特定关系的对象
ObjectBox: Get objects with specific relations
期待两个实体 Movie
和 Genre
:
@Entity
public class Movie {
@Id
private long id;
private String name;
private ToMany<Genre> genres;
[...]
}
@Entity
public class Genre {
@Id
private long id;
private String name;
[...]
}
我们都知道如何创建关系并保存它:
Movie movie = new Movie();
movie.setTitle("Star Wars");
movie.getGenres().add(new Genre("Sci-Fi");
box.put(movie);
但是是否有可能查询所有具有特定 Genre
的 Movie
对象?喜欢
Box<Movie> box = boxStore.boxFor(Movie.class);
Query query = box.query()
.equal(Genre_.name, "Sci-Fi") // note that I want to query the Movie-Box with Genre-properties
.build();
List movies = query.find();
我的目标是以简单的方式查找特定类型的所有电影。有谁知道该怎么做,还是我必须查询所有电影并自行过滤结果?还是我必须以其他方式调整我的实体?
更新:
我在下面为一个工作示例准备了正确的标记答案:
final Genre genreSciFi = genreBox.query().equal(Genre_.name, "Sci-Fi").build().findFirst();
List<Movie> filteredMovies = movieBox.query().filter(new QueryFilter<Movie>() {
@Override
public boolean keep(@NonNull Movie entity) {
return entity.getGenres().contains(genreSciFi);
}
}).build().find();
要使 contains
-方法正常工作,请覆盖 Genre
-实体中的 equals
-方法:
@Override
public boolean equals(Object obj) {
return obj instanceof Genre && ((Genre) obj).getId() == id && ((Genre) obj).getName().equals(name);
}
遗憾的是,API 的这一部分尚未在 Java 中公开。我们希望尽快重构查询 API。
在准备就绪之前,您可以使用 query filtering 解决方法。为简洁起见,使用 Java/Kotlin-ish 代码的示例:
Query query = movieBox.query().filter(movie -> {
return genres.contains(genre -> {
return "Sci-Fi".equals(genre.getName())
}
}).build()
(将在 Java 中与下一次更新相似。)
期待两个实体 Movie
和 Genre
:
@Entity
public class Movie {
@Id
private long id;
private String name;
private ToMany<Genre> genres;
[...]
}
@Entity
public class Genre {
@Id
private long id;
private String name;
[...]
}
我们都知道如何创建关系并保存它:
Movie movie = new Movie();
movie.setTitle("Star Wars");
movie.getGenres().add(new Genre("Sci-Fi");
box.put(movie);
但是是否有可能查询所有具有特定 Genre
的 Movie
对象?喜欢
Box<Movie> box = boxStore.boxFor(Movie.class);
Query query = box.query()
.equal(Genre_.name, "Sci-Fi") // note that I want to query the Movie-Box with Genre-properties
.build();
List movies = query.find();
我的目标是以简单的方式查找特定类型的所有电影。有谁知道该怎么做,还是我必须查询所有电影并自行过滤结果?还是我必须以其他方式调整我的实体?
更新: 我在下面为一个工作示例准备了正确的标记答案:
final Genre genreSciFi = genreBox.query().equal(Genre_.name, "Sci-Fi").build().findFirst();
List<Movie> filteredMovies = movieBox.query().filter(new QueryFilter<Movie>() {
@Override
public boolean keep(@NonNull Movie entity) {
return entity.getGenres().contains(genreSciFi);
}
}).build().find();
要使 contains
-方法正常工作,请覆盖 Genre
-实体中的 equals
-方法:
@Override
public boolean equals(Object obj) {
return obj instanceof Genre && ((Genre) obj).getId() == id && ((Genre) obj).getName().equals(name);
}
遗憾的是,API 的这一部分尚未在 Java 中公开。我们希望尽快重构查询 API。
在准备就绪之前,您可以使用 query filtering 解决方法。为简洁起见,使用 Java/Kotlin-ish 代码的示例:
Query query = movieBox.query().filter(movie -> {
return genres.contains(genre -> {
return "Sci-Fi".equals(genre.getName())
}
}).build()
(将在 Java 中与下一次更新相似。)