Убрать запрос SQL из цикла

Рейтинг: 1Ответов: 1Опубликовано: 10.05.2023

Не могу додуматься, как сделать запрос из БД так, чтобы вынести его из цикла:

Есть метод для получения фильмов

public Collection<Film> getFilms() {
    //create film
    String sqlFilmById = "SELECT * FROM FILMS LEFT OUTER JOIN RATINGS ON FILMS.RATINGMPAA_ID = RATINGS.RATINGMPAA_ID";
    List<Film> films = jdbcTemplate.query(sqlFilmById, FilmDBStorage::makeFilm);

    for (Film film : films) {
        //create genre to film
        String sqlFilmGenres = "SELECT * " +
                "FROM FILM_GENRES LEFT OUTER JOIN GENRES " +
                "ON GENRES.GENRE_ID = FILM_GENRES.GENRE_ID " +
                "WHERE FILM_ID = ?";
        List<Genre> filmGenres = jdbcTemplate.query(
                sqlFilmGenres, FilmDBStorage::makeGenre, film.getId());
        //put genre to film
        film.setGenres(filmGenres);
    }

    return films;
}

Так я получаю жанр из таблицы

static Genre makeGenre(ResultSet rs, int rowNum) {
    return new Genre(
            rs.getInt("GENRE_ID"),
            rs.getString("GENRE_NAME")
    );
}

Сам класс Film

public class Film {
private Integer id;
private String name;
private String description;
private LocalDate releaseDate;
private Integer duration;

private List<Genre> genres = new ArrayList<>();
private MPA mpa;
private Integer rate;

И класс Genre

public class Genre {
@Positive
protected int id;
@NotBlank
protected String name;

Структура БД введите сюда описание изображения

Ответы

▲ 1Принят

Что-то типа

SELECT * 
FROM films 
LEFT OUTER JOIN ratings ON films.ratingmpaa_id = ratings.ratingmpaa_id
LEFT OUTER JOIN film_genres ON film_genres.film_id = films.film_id 
LEFT OUTER JOIN genres ON genres.genre_id = film_genres.genre_id

Проверь условие связывания (имена полей) во втором LEFT JOIN.