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