para iterar una lista utilicen el método forEach directamente de la lista y no desde un stream
Podrías darnos más información sobre por que seria mejor el forEach?
porque es mejor iterarlo sin el stream??
Filtros de consultas con el condicional "LIKE"
Por patron: Utilizamos el comodin %
Para saltar por posicion de caracter: Utilizamos el comodin _
WHEREColumnaLIKE`"%User1%"`
Busca los registros con el patron "User1"
WHEREColumnaLIKE`"Use%"`
Busca los registros que comienzen con el patron "Use"
WHEREColumnaLIKE`"er1%"`
Busca los registros que terminen con el patron "er1"
WHEREColumnaLIKE`"_s"`
Busca el patron que tenga como segundo caracter s
WHEREColumnaLIKE`"_ _ _ _ _"`
Busca el patron que tenga como longitud 5 caractéres
También se puede hacer la consulta de esta manera
el "findBy" nos permite hacer la consulta seguido de el campo por el cual vamos a buscar en este caso "email" y si queremos buscar por nombre he email podría escribirse de esta manera
@Query
Optional<User> findByNameAndEmail(String name, String email);
@QueryOptional<User>findByEmail(String email);
Exacto, buen aporte, a mi me ha funcionado sin la anotación @Query
esos ya es otro tema que se llaman QueryMethods, que colocas Querys a traves del camelCase de sus metodos y no necesitas hacer las Queries nativas ni colocar la anotacion @Query
Saben si Michael Garcia utiliza algun pluggin del IDE para que Select - from y WHERE se le marque de un color diferente? porque en mi IDE se ve toda la sentencia del mismo color. Y veo que me pasa en otras sentencias donde a el si se le ponen algunos keywords en color diferente.
Hola Rayser, no utilizo ningún plugin.
El profe usa inttellij ultimate que es la versión de pago.
Si te lanza la siguiente excepción:
Exception encountered during context initialization - cancelling refresh attempt:org.springframework.beans.factory.UnsatisfiedDependencyException:Error creating bean withname 'appSpring':Unsatisfied dependency expressed through constructor parameter 5; nested exception is org.springframework.beans.factory.BeanCreationException:Error creating bean withname 'userRepository' defined in com.omju.springboot.repository.UserRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration:Invocation of init method failed; nested exception is org.springframework.data.repository.query.QueryCreationException:Could not create query forpublicabstractjava.util.Optionalcom.omju.springboot.repository.UserRepository.findUserByEmail(java.lang.String);Reason:Validation failed for query for method publicabstractjava.util.Optionalcom.omju.springboot.repository.UserRepository.findUserByEmail(java.lang.String)!;nested exception is java.lang.IllegalArgumentException:Validation failed for query for method publicabstractjava.util.Optionalcom.omju.springboot.repository.UserRepository.findUserByEmail(java.lang.String)!org.springframework.data.repository.query.QueryCreationException:Could not create query forpublicabstractjava.util.Optionalcom.omju.springboot.repository.UserRepository.findUserByEmail(java.lang.String);java.lang.IllegalArgumentException:Validation failed for query for method publicabstractjava.util.Optionalcom.omju.springboot.repository.UserRepository.findUserByEmail(java.lang.String)!
Yo lo resolví de la siguiente forma:
En el archivo UserRepository.java se tiene este código en la clase:
@Query("select u from Users u where u.email=?1)Optional<User>findByEmail(String email);
Esto me generaba la excepción del inicio. Investigando un poco hay que especificar que el query se va a usar de forma nativa, así:
@Query(value ="select u from Users u where u.email=?1", nativeQuery =true)Optional<User>findByEmail(String email);
Esto me generó otra excepción pero esta vez fue de sintaxis, esto por el uso de u en el query: select u from.... Entonces lo resolví colocando el *.
@Query(value ="select * from Users u where u.email=?1", nativeQuery =true)Optional<User>findByEmail(String email);
Con esto ya funcionó sin problema, pero, personalmente me agrada más ser más claro con los parámetros que se envían en el query así que hice uso de la notacióm @Param("param_name").
@Query(value ="select * from Users u where u.email=:email", nativeQuery =true)Optional<User>findByEmail(@Param("email")String email);
Para el segundo método findNameSort intenté hacer lo mismo, pero me lanzaba un error en el cual decía que la interface Sort como argumento no puede usarse de forma nativa en el query; así que lo resolví de la siguiente forma.
@Query(value ="select * from Users u where u.name like :name% order by u.id_user desc", nativeQuery =true)List<User>findUsersByName(@Param("name")String name);
Esto es la forma en la que resolví estos problemas, probablemente alguien sepa como atacarlo de una mejor y más optima forma.
Espero te sirva 💚.
Asegúrense de no poner varios usuarios con el mismo email de lo contrario tendrán un error.
Genial la aclaración tuve un error ahí XD
Dentro de getInformationJpqlFromUser si estas trabajando arriba de java 9 podes usar esta forman:
this.userRepository.findByName("braian").ifPresentOrElse( user ->System.out.println("User: "+user.getName()),()->System.out.println("No existe el usuario"));
👍
¿Por qué se pone un número después del ? en los parámetros del query? ¿es necesario?
Sirve para decir que el primer parametro de entrada va ir ahi, si tuviesemos varios parametros, simplemente con el numero podriamos apuntarlo.
Te recomiendo usar el @Param para defininir los parámetros con ? puede ser engorroso para varios parametros.
@Query("SELECT u FROM User u WHERE u.status = :status and u.name = :name")UserfindUserByUserStatusAndUserName(@Param("status")Integer userStatus, @Param("name")String userName);
Dato: si no cambias el nombre del parametro, puedes prescindir del @Param
@Query("SELECT u FROM User u WHERE u.status = :status and u.name = :userName")UserfindUserByUserStatusAndUserName(@Param("status")Integer userStatus,String userName);
Lo siento mucho pero en casi todo el curso no enseña nada, una desilusión
Por si también les causó duda el ver "?1" en la query les dejo este enlace
Es básicamente una manera de indicar los parámetros de la query, también se explica que se pueden usar nombres ("u.email = :email", por ejemplo) y de esta manera puede ser más legible, pero lo importante es no combinar los dos métodos
En esta clase mi código me lanzaba un error al momento de correrlo y el error me decía algo de que tenía error al con el Bean de la clase User. al mirar me di cuenta el @Id se importaba desde una librería diferente. la librería desde la cual no lanza error es:
import javax.persistence.*;
Tengo muchos errores en mi codigo y no compila como deberia.
Basicamente eso no me va a detener.
como se le puede pasar esto a una variable:
userRepository.findByUserEmail("alex@gmail.com")
cada vez que pongo esta linea
"select u from
se quiebra mi codigo ni siquiera ejecuta el query anterior a alguien mas le sucedio
No entiendo porqué le funciona así. Aunque básicamente la consulta retorna todos los datos del usuario, puedes cambiar a lo siguiente y te debería funcionar.
SELECT*FROM.....
No entiendo porque se utilizan 2 u, que significa la primera ? Entiendo que la segunda sería la referencia.
Necesitoun apoyo, comopuedocrearuna consultacon varias tablas relacionadas ??
No me quedo muy claro que hace el % en este query. Alguien me lo podría explicar?
Y tampoco entendí como funciona el segundo parámetro, sort en este query. El simple hecho de ser un parametro le indica a la consulta en que orden debe devolver los objetos?
@Query("Select u from User u WHERE u.name like ?1%")List<User>findAndSort(String name,Sort sort);
Hola :D
Dice que te dé todos los valores que inicien con ?1 y luego vaya lo que sea. Te dejo una tabla para que veas cómo funciona este operador
No sabia que las queries arriba de una metodo era JSQL, siempre crei que eso era HQL... ¿Que seria entonces HQL?