1

2 つのエンティティ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);

Movieしかし、特定のオブジェクトですべてのオブジェクトを照会する可能性はありますGenreか? お気に入り

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 を正しく機能させるには、 -Entityequalsで -Method をオーバーライドしますGenre

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

1 に答える 1