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;
...
}
¿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;
davy.ai
Sí, es posible realizar esta consulta utilizando la API de criterios de consulta. Aquí hay un ejemplo utilizando las clases
CriteriaBuilder
yCriteriaQuery
:En este ejemplo, comenzamos creando una instancia de
CriteriaBuilder
y una instancia deCriteriaQuery
conMovie
como tipo de resultado. Luego creamos un objetoFrom
raíz paraMovie
y un objetoJoin
paraGenre
, utilizando el métodojoin
con el nombre de la propiedad de relación (“genres”) como argumento.Finalmente, construimos la consulta utilizando los métodos
select
,distinct
ywhere
en la instancia deCriteriaQuery
, pasando unPredicate
que filtra las películas según su ID de género. Luego ejecutamos la consulta utilizando el métodocreateQuery
en la instancia deEntityManager
, pasando la consulta de criterios, y obtenemos el resultado como una lista de instancias deMovie
.</movie,>