Spring Data JPA: consulta ManyToMany

2 minutos de lectura

avatar de usuario de qwe asd
qwe asd

tengo entidades User y Test

@Entity
public class User {
    private Long id;
    private String userName;
}

@Entity
public class Test {
    private Long id;

    @ManyToMany
    private Set<User> users;
}

Puedo obtener todas las pruebas por entidad de usuario:

public interface TestRepository extends JpaRepository<EventSettings, Long> {
    List<Test> findAllByUsers(User user);
}

Pero, ¿qué consulta puedo usar para encontrar todas las pruebas por userName?

La siguiente firma de método hará que quieras querer:

List<Test> findByUsers_UserName(String userName)

Esto es usando el expresión de propiedad característica de Spring Data JPA. La firma Users_UserName será traducido al JPQL x.users.userName. Tenga en cuenta que esto realizará una coincidencia exacta en el nombre de usuario dado.

  • ¿Cómo hacer esto en JPQL (en la anotación de consulta)?

    – Oleksandr H.

    7 de agosto de 2017 a las 19:48

  • se puede lograr usando join. mira mi respuesta

    – ArslanAnjum

    18 de agosto de 2017 a las 17:47

  • ¡Excelente solución, muchas gracias! He estado buscando por un tiempo.

    – dave0688

    5 de octubre de 2017 a las 13:34

Otra respuesta muestra cómo lograr la funcionalidad deseada utilizando la técnica de nomenclatura de funciones. Podemos lograr la misma funcionalidad usando la anotación @Query de la siguiente manera:

@Query("select t from Test t join User u where u.username = :username")
List<Test> findAllByUsername(@Param("username")String username);

  • Pero ¿por qué?

    –Kevin Van Dyck

    18 de febrero de 2018 a las 14:23

  • @KevinVanDyck: porque necesita poner la condición en la entidad Usuario, pero muchos a muchos no se define como bidireccional, por lo que debe comenzar desde la entidad que lo define, es decir. Prueba

    – GabyM

    20 de septiembre de 2018 a las 12:43


Estaba usando @JoinTable y lo hice funcionar con esto:

@Query("select t from Test t join t.users u where u.username = :username")
List<Test> findAllByUsername(@Param("username") String username);

t.users u en vez de User u

¿Ha sido útil esta solución?