Cesar Jesus Gtz
Hinder Adrian Alvarez Perlaza
Genial estos apuntes que haces. Deberías tenerlos en Git Hub o algún lugar centralizado.
Jean Nuñez
Buen aporte, gracias
¿Cómo utilizar queryMetods en Spring Data para consultas sin SQL?
Los queryMetods son una herramienta valiosa y potente en Spring Data que facilita la realización de consultas sin la necesidad de escribir código SQL directamente. Esta alternativa es particularmente útil en situaciones donde los repositorios estándar de Spring Data no pueden proporcionar la información que necesitas. A continuación, exploraremos cómo los queryMetods funcionan, qué ventajas ofrecen y cómo puedes aprovecharlos para hacer tu código más eficiente y flexible.
¿Qué son y cómo funcionan los queryMetods?
Los queryMetods permiten generar consultas simplemente mediante el nombramiento de métodos de una forma específica. Esto se hace sin tener que escribir consultas en SQL, lo cual es posible gracias a ciertas convenciones de nomenclatura que el framework Spring interpreta para generar la consulta adecuada. Aquí tienes un ejemplo de cómo esto se traduce al código:
// Ejemplo de método query para encontrar productos por ID de categoría y ordenar por nombre public List<Producto> findByIDCategoriaOrderByNombreAsc(Integer idCategoria);
¿Qué ventajas ofrecen los queryMetods?
Los queryMetods no solo eliminan la necesidad de escribir SQL, sino que también:
Un ejemplo práctico sería clasificar una lista de productos según una categoría específica, lo cual se puede implementar usando la misma estructura simple:
// Método en un repository para obtener productos por categoría public List<Product> findByIDCategoria(int idCategoria);
¿Query nativos o queryMetods?
Aunque el uso de queryMetods es generalmente preferible por su flexibilidad y mejor práctica, existe la opción de utilizar consultas nativas a través de anotaciones. Por ejemplo:
// Uso de consulta nativa para encontrar productos por ID de categoría @Query(value = "SELECT * FROM productos WHERE id_categoria = ?1", nativeQuery = true) public List<Product> getByCategoria(int idCategoria);
Este enfoque puede ser útil en situaciones donde se requiere mayor control sobre la consulta SQL.
¿Cómo crear métodos más complejos con queryMetods?
Los queryMetods también te permiten combinar varias condiciones de búsqueda. Por ejemplo, buscar productos cuya cantidad en stock sea menor a un umbral y que estén activos:
// Uso de operadores para encontrar productos con bajo stock y activos public Optional<List<Product>> findByCantidadDeStockLessThanAndEstado(int cantidad, boolean estado);
Para implementar este método en tu repositorio, podrías hacer algo así:
// Método en el repositorio de productos public Optional<List<Product>> getEscasos(int cantidad, boolean estado) { return productoRepository.findByCantidadDeStockLessThanAndEstado(cantidad, true); }
Te recomiendo que experimentes creando tus propios queryMetods, descubriendo así cómo pueden adaptarse a las necesidades específicas de tu aplicación. La práctica te permitirá dominar el arte de las consultas en Spring Data, haciendo que tu sistema sea más robusto y sostenible. ¡Anímate a compartir tus descubrimientos en las discusiones y sumérgete en el apasionante mundo de Spring Data!
Cesar Jesus Gtz
Hinder Adrian Alvarez Perlaza
Genial estos apuntes que haces. Deberías tenerlos en Git Hub o algún lugar centralizado.
Jean Nuñez
Buen aporte, gracias
german rodrigo sanz brekes
Creo que de la ruta de Java es sin dudas el mejor curso, se entiende a la perfeccion lo que expica Alejandro y Java Spring es realmente sorprendente..
Rolando Mamani Salas
Verdad que si
RAQUEL MARISOL
De acuerdo contigo, de todos los que he visto, este si que me ha gustado.
Cristobal Vega
Si quieren aprender más sobre los Optionals les recomiendo esta clase:
https://platzi.com/clases/1826-java-funcional/26239-la-clase-optional/ :rocket:
Rolando Mamani Salas
Sera mi proxima clase... muchas gracias
Israel Romero Garcia
Lo que no me gusta es que lleva buen rato escribiendo un montón de código y no ha probado nada para ver si funciona
ROMMEL DUAREZ SAENZ
no funciona porque le falta la anotación @Autowired
Héctor Avilés
Muy interesante el tema sin duda :D, pero recuerden que no es una buena práctica de seguridad utilizar en su código Querys, lo mejor para consumir bases de datos son Stored Procedures para evitar ataques SQL Injection entre muchos otros.
Edward Fernandez
Ricardo Exequiel De Angelis
Para que necesitaría buscar precios?
Fernando Marcel Ovelar Mereles
busca productos que su precio de venta sea inferior al solicitado y ordena por categoria
Junior Aguilera
Sin duda el mejor curso que he visto en platzi...
Felipe de Jesús Galindo Aguilar
Estos son los métodos que agregué a la clase Compra.
geerson hugo pizarro mendivil
La clase estuvo muy buena, pero me quedó una duda acerca de porqué utiliza el optional y cual es el proposito de esta?
Alejandro Ramírez
ProfesorEl uso del Optional es para demostrar que los Query Methods soportan este tipo de retorno que nos permite darle un enfoque funcional a nuestra aplicación. Te recomiendo el curso de Programación Funcional que tenemos aquí en Platzi, específicamente la clase donde hablan del Optional para que observes todo el potencial que tiene esta funcionalidad.
Alan Lapierre
Gran curso, aun al día de hoy, si bien lo habia visto anteriormente y trabajo como desarrollador Java me sirve de base para un side project. Se aprecia la arquitectura orientada al dominio, es un buen punto de partida para empezar a construir algo.
Luis Brandon Flores González
Se pueden usar Query Methods o de manera nativa, pero es preferible la primera.
Julian Sanchez
Los query methods son muy prácticos, son fáciles de usar y cómodos. Pero por favor, no los utilicen para queries complejas aunque funcione. He visto query methods con más de 100 caracteres de nombre, muy ilegibles, preferible utilizar JPQL y poner un nombre amigable.
Cesar Lozano Rodriguez
me parece bien potente esto de los Query Methods, sin embargo pienso que hacer un refactor - que muchas veces implica mejorar los nombres de nuestros atributos - provocaria que se caiga el/los Query Method(s) cuyo nombre esta asociado a dicho atributo, y esto ocurriria sin siquiera saberlo ya que el compilador no detectaria dicho metodo como erroneo, este error seria solo detectado en runtime.
Juan Calderón
Buen apunte, compañero
David Gallego
Optional<List<Producto>> findByPrecioVentaGreaterThanEqualAndCantidadStockLessThanOrderByNombre(double precioVenta, int cantidadStock);
Eduard Arias
A mi en lo personal me gusta @Query porque siento mucho mas control sobre las consultas que se realizan en los métodos. Sin embargo, he notado que usar los Query Methods nos ahorra mucho trabajo en ciertas zonas y lo he empezado a utilizar con más frecuencia en mis proyectos. :rocket:
Alejandro Rico García
Una variante extra a @Query es: @NamedQuery
Se declara así:
@Entity @NamedQuery(name = "User.findByEmailAddress", query = "select u from User u where u.emailAddress = ?1") public class User { }
y se usa así:
public interface UserRepository extends JpaRepository<User, Long> { List<User> findByLastname(String lastname); User findByEmailAddress(String emailAddress); }
Favio Amarilla Miño
Por una experiencia personal les recomiendo a todos aplicar una una buena practica que es la de definir el tipo de dato para los id, ya sean variables o parámetros de métodos colocar como Long, ya que en sistemas de la vida real con muchísimos datos puede llegar a causarles problemas.
Israel Camacho
La respuesta siempre va a ser "depende"; dos mil ciento cuarenta y siete millones de registros o valores únicos son más que suficientes para la mayoría sistemas de medianos a grandes, si habrá situaciones particulares que requerirás más, o en sistemas distribuidos quizás un UUID sea lo más conveniente, pero yo estoy mas en pro de hacer un buen uso de los recursos tanto de BD como de memoria, al final el diseño lo define considera siempre el crecimiento.
Carlos Alberto Gonzalez Rembao
Muy buen tema. gracias por explicarlo tan claro!
Osvaldo Garcia
profesor! muchas gracias por la manera de explicar! me ha quedado super claro y quede muy intrigado con saber mas acerca de los query methods
ProductoCrudRepository
Optional<List<Producto>> findByPrecioVentaLessThanAndIdCategoriaOrderByNombreAsc(int precioVenta, int idCategoria);
ProductoRepository
public Optional<List<Producto>> getProductoByPrecioVentaLessThanPriceAndByCategory (int precioVenta, int idCategoria) { return productoCrudRepository.findByPrecioVentaLessThanAndIdCategoriaOrderByNombreAsc(precioVenta, idCategoria); }