es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Criterio JPA 2: unir muchas a muchas en una relación unidireccional.

Tengo dos entidades, Película y Género, con una relación de muchos a muchos desde género a película. Género siendo el “padre” de la relación.
Esto genera tres tablas: genre, movie y genre_movie

@Entity
public class Genre {
  @Id
  @GeneratedValue(strategy = AUTO)
  private Long id;

  @ManyToMany(fetch = LAZY)
  @JoinTable( name = "genre_movie",
    joinColumns = {@JoinColumn(name = "genre_id")},
    inverseJoinColumns = {@JoinColumn(name = "movie_id")}
  )
  private Set<movie> movies = new HashSet<>();

...
}

@Entity
public class Movie {
  @Id
  @GeneratedValue(strategy = AUTO)
  private Long id;
  ...
}

Entity Diagram

¿Es posible realizar esta consulta utilizando la API de criterios de consulta? Filtrar películas en función de su identificación de género.

sql
select *
from movie
join genre_movie on movie.id = genre_movie.movie_id
where genre_id = 19;

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible realizar esta consulta utilizando la API de criterios de consulta. Aquí hay un ejemplo utilizando las clases CriteriaBuilder y CriteriaQuery:

    Long genreId = 19L;
    
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<movie> query = builder.createQuery(Movie.class);
    
    Root<movie> movie = query.from(Movie.class);
    Join<movie, genre=""> genre = movie.join("genres");
    
    query.select(movie)
         .distinct(true)
         .where(builder.equal(genre.get("id"), genreId));
    
    List<movie> result = entityManager.createQuery(query).getResultList();
    

    En este ejemplo, comenzamos creando una instancia de CriteriaBuilder y una instancia de CriteriaQuery con Movie como tipo de resultado. Luego creamos un objeto From raíz para Movie y un objeto Join para Genre, utilizando el método join con el nombre de la propiedad de relación (“genres”) como argumento.

    Finalmente, construimos la consulta utilizando los métodos select, distinct y where en la instancia de CriteriaQuery, pasando un Predicate que filtra las películas según su ID de género. Luego ejecutamos la consulta utilizando el método createQuery en la instancia de EntityManager, pasando la consulta de criterios, y obtenemos el resultado como una lista de instancias de Movie.</movie,>

Comments are closed.