ObjectBox:获取具有特定关系的对象

期待这两个实体MovieGenre

 @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 -Method正确地工作,覆盖equals您的Genre方法 – 实体:

 @Override public boolean equals(Object obj) { return obj instanceof Genre && ((Genre) obj).getId() == id && ((Genre) obj).getName().equals(name); } 

不幸的是,这部分API还没有在Java中公开。 我们希望尽快重构查询API。

在准备就绪之前,您可以使用查询过滤来解决问题 。 为简洁起见,使用Java / Kotlin-ish代码示例:

 Query query = movieBox.query().filter(movie -> { return genres.contains(genre -> { return "Sci-Fi".equals(genre.getName()) } }).build() 

(在下一次更新时,会使它与Java类似)