Spring Data JPA - запрос многие ко многим - PullRequest
0 голосов
/ 21 мая 2018

У меня есть две сущности: Человек и Кино.

@Entity
public class Person {
..some fields

@ManyToMany(fetch = FetchType.LAZY, mappedBy = "actors")
@OrderBy("id")
private Set<Movie> moviesActor = new TreeSet<>();

}

@Entity
public class Movie {
..fields
@JoinTable(name = "actor_movie",
            joinColumns = { @JoinColumn(name = "movie_id") },
            inverseJoinColumns = { @JoinColumn(name = "actor_id") })
    private Set<Person> actors = new TreeSet<>();
}

Существует множество отношений, поэтому существует новая таблица actor_movie для ее сохранения.И как я могу получить каждого человека, у которого есть какой-нибудь фильм в его наборе?Так что я хочу добиться, чтобы получить каждого человека, который существует в таблице actor_movie.Я пытался использовать Spring данных jpa, но не смог найти правильный запрос.

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Поскольку вы используете ленивый тип извлечения, вам нужно использовать объединение извлечения, чтобы получить moviesActor.

Вы можете использовать jpql с пружинными данными. Я не проверял запросы ниже , но должен работать.

public interface PersonRepository extends JpaRepository<Person, Long> { //Long if Person.id is of type Long

  @Query("SELECT p FROM Person p LEFT JOIN FETCH p.moviesActor WHERE size(p.moviesActor) > 0");
  List<Person> findActors1();

  // Or

  @Query("SELECT p FROM Person p JOIN FETCH p.moviesActor");
  List<Person> findActors2();

}

Подробнее об операторе размера jpql здесь: https://www.thoughts -on-java.org / jpql/

0 голосов
/ 29 мая 2019

Вы можете использовать join напрямую:

@Query("SELECT p FROM Person p  JOIN  p.moviesActor movie");

Список findPersonHasMovie ();

0 голосов
/ 21 мая 2018

Вам нужен только один JOIN между человеком и фильмом.Поскольку Hibernate абстрагирует существование средней таблицы, вам не нужно об этом беспокоиться.

Итак, с репозиторием данных Spring:

class PersonRepository extends CrudRepository<Person, Long> {

    List<Person> findByMoviesActor();
}

С Jpql:

SELECT person FROM Person person JOIN person.moviesActor movie
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...