У меня проблема с получением ленивой @ManyToMany
ассоциации в spring-data-jpa
.
У меня есть список фильмов, связанных с пользователями, которые сделали этот фильм любимым, и список жанров:
@Entity
@Table("movie")
public class Movie {
...
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(...)
private List<Genre> genres;
@ManyToMany
@JoinTable(name = "users_movies",
joinColumns = @JoinColumn(name = "movie_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"))
private List<User> users = new ArrayList<>;
}
Жанры также связаны с пользователями, которые отметили этот жанр как любимый:
@Entity
@Table("genre")
public class Genre {
....
@ManyToMany
@JoinTable(name = "users_genres",
joinColumns = @JoinColumn(name = "genre_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"))
private List<User> users;
}
И у меня есть репозиторий со следующим методом / запросом, который должен возвращать все фильмы по любимым жанрам и загружать пользователя фильмов, чтобы я мог отобразить, пометил ли пользователь фильм как избранное:
@Query(value = "SELECT movie FROM Movie movie " +
"JOIN movie.genres genre JOIN genre.users grenreUser " +
"LEFT JOIN FETCH movie.users " +
"WHERE grenreUser.id = :userId",
countQuery = "SELECT COUNT(movie) FROM Movie movie " +
"JOIN movie.genres genre JOIN genre.users grenreUser " +
"LEFT JOIN movie.users " +
"WHERE grenreUser.id = :userId")
Page<Movie> getAllMoviesByFavoriteGenres(@Param("userId") String userId, Pageable);
Но здесь у меня проблема, movie.getUsers()
пусто после выполнения этого запроса.
Я обнаружил , что использование @EntityGraph
может помочь, но это не значит, что ассоциация movie.getUsers()
все еще пуста.
Я также пытался сделать эту ассоциацию как FetchType.EAGER
просто для тестирования, но она все еще пуста.
У меня нет идей, поэтому буду признателен за любую помощь.
UPD:
Это не могло быть проблемой с пользователями, отсутствующими в БД, поскольку у меня есть другой запрос, который извлекает только фильмы, которые отмечены как избранные пользователем в жанре избранного пользователя. Поэтому, если бы пользователь не присутствовал в БД, запрос вернул бы мне пустой результат, но я получил бы результат, хотя movie.getUsers()
пусто. Вот метод / запрос:
@Query(value = "SELECT movie FROM Movie movie " +
"JOIN movie.genres genre " +
"JOIN FETCH movie.users user " +
"WHERE user.id = :userId AND :userId MEMBER OF genre.users",
countQuery = "*same but with count*")
Page<Movie> getAllFavoriteMoviesByFavoriteGenres(@Param("userId") String userId, Pageable);