Estoy tratando de crear un método en CrudRepository que pueda darme una lista de usuarios, cuyos nombres de usuario son COMO el parámetro de entrada (no solo comienza con, sino que también lo contiene). Intenté usar el método "findUserByUsernameLike(@Param("username") String username)"
pero como se dice en la documentación de Spring, este método es igual a " where user.username like ?1
". No es bueno para mí, como ya dije que estoy tratando de obtener todos los usuarios cuyo nombre de usuario contiene ...
Escribí una consulta al método pero ni siquiera se implementa.
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
@Query("select u from user u where u.username like '%username%'")
List<User> findUserByUsernameLike(@Param("username") String username);
}
¿Puede alguien ayudarme con esto?
containing
para beneficiarse de los índices, consulte docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/…Respuestas:
Intente usar el siguiente enfoque (me funciona):
Aviso: el nombre de la tabla en JPQL debe comenzar con una letra mayúscula.
fuente
WHERE UPPER(u.username) LIKE CONCAT('%',UPPER(:username),'%')
para hacer una búsqueda que no distingue entre mayúsculas y minúsculas@Param
s están desinfectados, así que no.Usando Me gusta: seleccione ... como: nombre de usuario
Comenzando con: seleccione ... como: nombre de usuario%
EndingWith: seleccione ... como%: nombre de usuario
Contiene: seleccione ... como%: username%
Observe que la respuesta que busca es la número 4 . No tienes que usar @Query
fuente
List<User> findByUsernameContainingIgnoreCase(String username);
StartingWith: select ... like :username%
yEndingWith: select ... like %:username
... de todos modos, la gran respuesta ... debe ser la aceptada. Gracias.Otra forma: en lugar de la
CONCAT
función podemos usar tubería doble :: apellido || '%'Puede poner en cualquier lugar, prefijo, sufijo o ambos
fuente
List<User> findByUsernameContainingIgnoreCase(String username);
para ignorar los problemas del caso
fuente
Fácil de usar a continuación (no es necesario usar CONCAT o ||):
Documentado en: http://docs.spring.io/spring-data/jpa/docs/current/reference/html .
fuente
Para su caso, puede utilizar directamente los métodos JPA. Eso es como un bramido:
Contiene: seleccione ... como%: username%
aquí, IgnoreCase le ayudará a buscar el artículo ignorando el caso.
A continuación, se muestran algunos métodos relacionados:
Me gusta
findByFirstnameLike
... donde x.firstname como? 1
Empezando con
findByFirstnameStartingWith
... donde x.firstname como? 1 (parámetro enlazado con% añadido)
Terminando con
findByFirstnameEndingWith
... donde x.firstname como? 1 (parámetro enlazado con% antepuesto)
Conteniendo
findByFirstnameContaining
... donde x.firstname como? 1 (parámetro enlazado envuelto en%)
Más información, ver este enlace y este enlace
Espero que esto te ayudará :)
fuente
De esta manera funciona para mí, (usando Spring Boot versión 2.0.1. RELEASE):
Explicando: Los? 1,? 2,? 3, etc. son marcadores de posición del primer, segundo, tercer parámetro, etc. En este caso es suficiente tener el parámetro rodeado por% como si fuera una consulta SQL estándar pero sin el comillas simples.
fuente
@Query("SELECT u.username FROM User u WHERE u.username LIKE %:username%")
fuente
Probé este código y funciona.
fuente